我有一个房产。在我的单元测试中,我想确保不调用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?
答案 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