【发布时间】:2016-05-18 23:27:04
【问题描述】:
Moq 与 MsTest 的行为有点混淆。
编辑:这不是“我如何测试?”的问题。或“我如何断言?”,这是一个草稿本,可以查看 MoQ 是如何工作的,所以不要关注异常类型等。
我认为更好的问题可能是 =>“Moq Throws 的行为是否类似于 MsTest ExpectedExceptionAttribute?”也就是说,他们期望测试或 SUT 中出现异常?
我想知道 MoQ “Throws”在与 MsTest 一起使用时是如何工作的。不使用 MsTest 预期异常属性会更好吗?在测试中执行 try..catch 会更好吗?我还有一些关于这个的问题。
我正在模拟一个数据库调用,当发生错误时我想返回零 (0)。
TestMethod 直接使用 MsTest 异常属性,而 throws 异常使用 Moq。它仅在我在 SaveCart 方法中抛出异常时有效,而不是在我返回零时有效。
我想了解底层行为,因为感觉好像我不应该,也不想在 SaveCart 方法中引发异常。
这是有问题的测试:
[TestMethod]
[ExpectedException(typeof(ApplicationException))]
public void CartRepoSaveCartExceptionShouldReturnZero()
{
_cartDatabaseMock.Setup(c => c.SaveCart(_cart))
.Throws<ApplicationException>();
var result = _cartRepository.SaveCart(_cart);
Assert.AreEqual(result, _cartSaveExceptionValue);
}
这是基本的 SaveCart,它不会引发导致测试失败的异常:
public long SaveCart(Cart cart )
{
long returnValue;
try
{
returnValue = _cartDatabase.SaveCart(cart);
}
catch (Exception)
{
return 0;
}
return returnValue;
}
这是一个基本的 SaveCart,因为它引发了异常,所以测试可以在其中工作:
public long SaveCart(Cart cart )
{
long returnValue;
try
{
returnValue = _cartDatabase.SaveCart(cart);
}
catch (Exception)
{
throw new ApplicationException();
}
return returnValue;
}
如果问题解释不清楚,请随意建议一个更好的标题。
【问题讨论】:
-
我似乎找不到任何起订量文档,快速入门几乎没有 github.com/Moq/moq4/wiki/Quickstart。而且文档只有一个简单的例子nudoq.org/#!/Packages/Moq/Moq/IThrows/M/Throws我想我的困惑在于起订量异常是如何工作的。看起来被测试的方法必须抛出一个异常才能冒泡到测试方法,然后冒泡到MsTest 属性,但这让我很困惑。
-
我认为您的标题有点误导其他人提供测试起订量的正确方法。如果您想知道导致测试失败或通过的幕后情况。我建议你想出一个更好的标题。此处发布的所有答案对于测试起订量异常的正确方法都是完全有效的。无论如何,我认为您的问题是您的测试通过/失败的潜在行为。我试了一下并发布了答案。
-
我确信标题可能具有误导性,正如我在问题中指出的那样。我真的不知道 MoQ “扔”在做什么。
-
那么我发布的答案是否回答了您的问题,或者您仍然感到困惑,或者我误解了您的问题?无论如何,让我知道。我会尽力提供帮助。
标签: c# .net unit-testing moq mstest