我有这样一门课:
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。有办法这样做吗?
发布于 2014-12-13 04:28:36
实际上,在这种情况下,这需要调用一次OnSomePropertyChanged()。但至少不止一次。
然后,合适的assert语句可能如下所示:
_myClass.AssertWasCalled(m => m.OnSomePropertyChanged(), opt => opt.Repeat.Once());PS
应该编写另一个测试,以确保在实际更改OnSomePropertyCnahged()之后触发SomeProperty。
在这种情况下,在我们的测试中,保证在第一次更改OnSomePropertyCnahged()时触发SomeProperty。
期望值只被调用一次,而不是两次,可以保证事件不会在不被期望的情况下触发。
https://stackoverflow.com/questions/26145274
复制相似问题