2014-10-01 98 views
0

我有这样一个类:复位犀牛制品AssertWasNotCalled

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

实际上,在这种情况下,预期OnSomePropertyChanged()被调用一次。但不多也不少于一次。

合适的断言语句然后可能看起来像:

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

PS

另一个测试应当书面保证OnSomePropertyCnahged()SomeProperty被触发后实际上改变。

在这种情况下,在我们的测试中,当SomeProperty第一次被改变时,保证OnSomePropertyCnahged()被触发。
期望它被调用一次,但不是两次,保证事件不会被触发。

+0

但是我怎么知道SomeProperty是在第一次还是第二次设置时被调用? – ConditionRacer 2014-12-14 21:25:50

+0

我更新了我的答案和解释如何保证 – 2014-12-15 11:35:01