Unit testing 单元测试MVC控制器时出现冲突的结果

Unit testing 单元测试MVC控制器时出现冲突的结果,unit-testing,nunit,moq,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(A

我正在为我的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.SaveEventevt,我的存储库设置为失败。但是,在测试的稍后部分,我尝试验证是否调用了repository.SaveEventevt。既然它过去了,这不是意味着它既被调用,又没有被调用吗?也许这些陈述不像我想象的那样


有人能解释一下这两个语句为何不是对立的,以及它们如何都存在并且测试仍然通过吗?

也许您的测试不会失败,因为它有一个catch-everything块,它还隐藏了测试失败所必需的assert/verify异常

注:以下单元测试将始终通过

[Test]
public void HidingAssertionFailure()
{
    try {
        Assert.AreEqual(0,1); // this should fail
    } catch (Exception ex) {
        // this will hide the assertion failure
    }
}

此行为的原因是它正在运行SaveEvent,但是,由于模拟存储库没有定义该操作,它在我的控制器中引发异常,我的控制器正在捕获该异常


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

不,没有try/catch块。不过,谢谢你指出这一点。这对我将来可能会有帮助。