2010-11-08 41 views
25

如何使用Rhino Mocks從模擬/存根提升事件?使用Rhino Mocks從模擬/存根提高事件

我在網上發現了這個問題的一些答案,但它們似乎都使用了Record/Replay語法,但我使用了Arrange/Act/Assert語法。

有什麼建議嗎?

一個小例子...

比方說,我使用的MVVM模式,有這樣的模型類:

public class MyModel 
{ 
    private int _myValue; 

    public event EventHandler ValueChanged; 

    public void SetValue(int newValue) 
    { 
     _myValue = newValue; 
     if (ValueChanged != null) 
     { 
      ValueChanged(this, null); 
     } 
    } 
} 

正如你所看到班裏有一個整數值和方法設置它。當設置該值時,會引發ValueChanged事件。

這個模型類由一個視圖模型:

public class MyViewModel 
{ 
    private MyModel _myModel; 

    public MyViewModel(MyModel myModel) 
    { 
     _myModel = myModel; 
     _myModel.ValueChanged += ValueChangedHandler; 
    } 

    private void ValueChangedHandler(object sender, EventArgs e) 
    { 
     MyString = "Value has changed"; 
    } 

    public string MyString { get; set; } 
} 

當它引發此視圖模型聽取模型和更新ValueChanged事件。

現在我想測試當模型引發事件時更新視圖模型。

[TestMethod] 
public void MyViewModel_ModelRaisesValueChangedEvent_MyStringIsUpdated() 
{ 
    //Arrange. 
    var modelStub = MockRepository.GenerateStub<MyModel>(); 
    MyViewModel viewModel = new MyViewModel(modelStub); 

    //Act 
    -HERE I WANT TO RAISE THE VALUE CHANGED EVENT FROM modelStub. 

    //Assert. 
    Assert.AreEqual("Value has changed", viewModel.MyString); 
} 

請注意,這只是一個例子,而不是我的實際代碼(這更復雜)。我希望你能忽視任何錯別字和其他小錯誤。

回答

32
[TestMethod] 
public void MyViewModel_ModelRaisesValueChangedEvent_MyStringIsUpdated() 
{ 
    //Arrange. 
    var modelStub = MockRepository.GenerateStub<IModel>(); 
    MyViewModel viewModel = new MyViewModel(modelStub); 

    //Act 
    modelStub.Raise(
     x => x.ValueChanged += null, 
     modelStub, // sender 
     EventArgs.Empty); 

    //Assert. 
    Assert.AreEqual("Value has changed", viewModel.MyString); 
} 

編輯:您所遇到的錯誤或許可以通過改變存根類型的接口IModel來解決(這是我自己的測試是如何工作的)。我在上面的例子中改變了它,但是你也必須改變MyViewModel構造函數聲明來獲取接口類型。

virtual關鍵字添加到事件聲明也可能有效。

相關問題