我有一个这样的课程:
public class MyClass
{
private MyStruct _someProperty;
public MyStruct SomeProperty
{
set
{
if(StructureChanged(_someProperty, value))
{
_someProperty = value;
OnSomePropertyChanged();
}
}
}
private bool StructureChanged(MyStruct oldValue, MyStruct newValue)
{
// Check if any property of newValue is different from oldValue
// This is a check for semantic equality, not referential equality
}
internal protected virtual OnSomePropertyChanged()
{
// ...
}
}
这样的测试:
// Arrange
_myClass = MockRepository.GeneratePartialMock<MyClass>();
_myClass.SomeProperty = new MyStruct();
// Act
_myClass.SomeProperty = new MyStruct(); // This is semantically equal to the current value
// Assert
_myClass.AssertWasNotCalled(m => m.OnSomePropertyChanged());
当然,测试失败,因为我第一次设置属性时会调用OnSomePropertyChanged。我想要的是第一次设置属性,以某种方式重置AssertWasNotCalled值,然后再次设置属性并确保不再调用OnSomePropertyChanged。有没有办法做到这一点?
答案 0 :(得分:1)
实际上,在这种情况下,预计OnSomePropertyChanged()
会被调用一次。但不是更多,也不是一次。
然后,合适的断言语句可能如下所示:
_myClass.AssertWasCalled(m => m.OnSomePropertyChanged(), opt => opt.Repeat.Once());
PS
应编写另一个测试,以确保在OnSomePropertyCnahged()
实际更改后触发SomeProperty
。
在我们的测试中,保证在第一次更改OnSomePropertyCnahged()
时触发SomeProperty
。
并且期望它被调用一次,但不是两次,保证在不期望事件时不会触发事件。