重置Rhino Mocks AssertWasNotCalled

时间:2014-10-01 15:47:07

标签: c# rhino-mocks

我有一个这样的课程:

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。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

实际上,在这种情况下,预计OnSomePropertyChanged()会被调用一次。但不是更多,也不是一次。

然后,合适的断言语句可能如下所示:

_myClass.AssertWasCalled(m => m.OnSomePropertyChanged(), opt => opt.Repeat.Once());

PS

应编写另一个测试,以确保在OnSomePropertyCnahged()实际更改后触发SomeProperty

在我们的测试中,保证在第一次更改OnSomePropertyCnahged()时触发SomeProperty。 并且期望它被调用一次,但不是两次,保证在不期望事件时不会触发事件。