Moq中“验证”方法中的奇怪行为

时间:2009-07-28 21:52:40

标签: c# unit-testing nunit mocking moq

在以下代码中,Test1成功但Test2失败:

protected Mock<IMyInterface> MyMock { get; set; }

[SetUp]
public virtual void  Initialize()
{
    MyMock = new Mock<IMyInterface>();
}

[Test]
void Test1()
{
    // ... code that causes IMyIntervace.myMethod to be called once

    MyMock.Verify(x=> x.myMethod(), Times.Once());
}

[Test]
void Test2()
{
    MyMock.Verify(x=> x.myMethod(), Times.Once());
}

这种行为实际上非常有用,但我无法弄清楚为什么它会像这样工作。似乎Test2也应该成功!

我唯一的想法就是以某种方式验证是否足够聪明,知道“myMethod”是从不同的测试用例调用的,所以它“不算数”?

BTW,即使我在Test1中删除了对Verify的调用,也会发生同样的事情(Test2失败)。

1 个答案:

答案 0 :(得分:6)

您的SetUp方法在每次测试之前运行,因此它在Test2之前重新创建模拟。

在Test2中,您没有做任何事情,因此验证失败。您正在尝试验证MyMethod是否已被调用 - 但它没有。所以,失败。

如果您尝试仅创建一次模拟,则需要使用[TestFixtureSetUp]