单元测试MVC控制器时的结果相互矛盾

时间:2011-03-21 19:34:02

标签: unit-testing nunit moq

我正在为我的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)”。既然它通过了,这是不是意味着它既被调用又被称为?也许这些陈述不会像我怀疑的那样发挥作用。

有人可以解释这两个陈述是如何不对立的,以及它们如何存在且测试仍然通过?

2 个答案:

答案 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()”,但是,由于模拟的存储库没有定义该操作,它在我的控制器中引发了一个异常,我的控制器正在捕获它。

因此,似乎只有在控制返回成功时才会执行回调。