我正在为我的MVC 2控制器编写单元测试(使用NUnit和Moq),并且遵循Steven Sanderson的Pro ASP.net MVC 2框架书中的示例(好书,顺便说一下)。但是,我遇到了问题,我认为这只是因为我对NUnit缺乏了解。
这是摘录,删除了不相关的部分:
[Test]
public void Cannot_Save_Invalid_Event()
{
...
repository.Setup(x => x.SaveEvent(evt)).Callback(Assert.Fail);
...
repository.Verify(x => x.SaveEvent(evt));
}
这个测试正在传递给我,虽然从我的理解,这两个陈述应该直接相互冲突。第二个原本不在那里,但是我把它放进去以确认它是正确的原因。
根据我的理解,如果调用“repository.SaveEvent(evt)”,我的存储库将设置为失败。但是,在测试的后期,我尝试验证是否调用了“repository.SaveEvent(evt)”。既然它通过了,这是不是意味着它既被调用又被称为?也许这些陈述不会像我怀疑的那样发挥作用。
有人可以解释这两个陈述是如何不对立的,以及它们如何存在且测试仍然通过?
答案 0 :(得分:0)
也许你的测试没有失败,因为它有一个catch-everything块,它也隐藏了测试失败所必需的assert / verify-exception。
注意:以下单元测试将全部通过
[Test]
public void HidingAssertionFailure()
{
try {
Assert.AreEqual(0,1); // this should fail
} catch (Exception ex) {
// this will hide the assertion failure
}
}
答案 1 :(得分:0)
这种行为的原因是它正在运行“SaveEvent()”,但是,由于模拟的存储库没有定义该操作,它在我的控制器中引发了一个异常,我的控制器正在捕获它。
因此,似乎只有在控制返回成功时才会执行回调。