2014-10-01 49 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