如何检查setter不会为moq对象调用

时间:2014-01-03 09:05:07

标签: c# unit-testing tdd moq

我有一个房产。在我的单元测试中,我想确保不调用set。我怎么能做到这一点?

我能够检查该值是否已设置,但如何确保未设置该值。

public ISomeInterface
{
    bool? SomeProperty { get; set; }
}


public SomeClass
{
    SomeClass(ISomeInterface someInterface)
    {    _someInterface = someInterface;    }

    public void SomeMethod(bool condition)
    {
         if (condition)
              _someInterface.SomeProperty = true;
    }
}

// Test
var moq = new Mock<ISomeInterface>();
var target = new SomeClass(moq.Object);

target.SomeMethod(false);

// Check here that someInterface.SomeProperty set is not called.
moq.VerifySet(i => i.SomePropery = true); // This checks that set is called. But how to check if it is not called?

2 个答案:

答案 0 :(得分:2)

moq.VerifySet(i => i.SomePropery = true,Time.Never);应该这样做。

但我更倾向于在SomeProperty被执行后测试SUT的值是假的,以便解除实际行为(SomeProperty没有从实际的实现细节(SomeProperty永远不会直接设置),结束为false,无论如何到达那里)。

例如,您可能稍后将代码重构为

public void SomeMethod(bool condition)
{
    _someInterface.SomeProperty = SomeOtherComponent.MakeTheDecision(condition)
}

意味着您的测试将保证失败,更糟糕的是,就_someInterface的实际价值而言将毫无意义(因为在这种情况下它总是set

请注意,这意味着在public上设置SomeProperty访问者,您可以从测试代码中访问该访问者;如果您不想这样做,那么您正在测试一个私有成员,而这个成员并不是单元测试的重点 - 您应该只测试公共实现。

只是我的2c。

答案 1 :(得分:0)

调用.VerifyAll()也可能会有所帮助:D