【问题标题】:Conflicting results when unit testing MVC controller单元测试 MVC 控制器时结果冲突
【发布时间】:2011-03-21 19:34:02
【问题描述】:

我正在为我的 MVC 2 控制器编写单元测试(使用 NUnit 和 Moq),并遵循 Steven Sanderson 的 Pro ASP.net MVC 2 Framework 书中的示例(好书,顺便说一句)。但是,我遇到了问题,我认为这只是由于我对 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)”。既然通过了,这不就意味着它既被调用了,又没有被调用?也许这些陈述不像我怀疑的那样。

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

【问题讨论】:

    标签: unit-testing nunit moq


    【解决方案1】:

    也许您的测试不会失败,因为它有一个 catch-everything 块,该块还隐藏了测试失败所必需的断言/验证异常。

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

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

    【讨论】:

    • 不,没有 try/catch 块。不过,感谢您指出这一点。这对我将来可能会有所帮助。
    【解决方案2】:

    这种行为的原因是它正在运行“SaveEvent()”,但是,由于模拟存储库没有定义该操作,它在我的控制器中引发了异常,而我的控制器正在捕获该异常。

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

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多