2010-11-08 14 views
25

Wie kann ich ein Ereignis von einem Mock/Stub mit Rhino Mocks auslösen?Ereignisse aus einem Mock/Stub mit Rhino Mocks auslösen

Ich habe einige Antworten auf diese Frage im Internet gefunden, aber sie scheinen alle die Record/Replay-Syntax zu verwenden, aber ich verwende die Arrange/Act/Assert-Syntax.

Irgendwelche Vorschläge?

Ein kleines Beispiel ...

Lassen Sie uns sagen, dass ich das MVVM Muster bin mit und dieses Modell Klasse haben:

public class MyModel 
{ 
    private int _myValue; 

    public event EventHandler ValueChanged; 

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

Wie Sie die Klasse einen Integer-Wert und ein Verfahren hat sehen können, dass setzt es. Wenn der Wert festgelegt wird, wird ein ValueChanged Ereignis ausgelöst.

Diese Modellklasse wird durch ein Ansichtsmodell verwendet:

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; } 
} 

Das Ansichtsmodell zum ValueChanged Ereignisse auf dem Modell und Updates hören, wenn sie angehoben wird.

Jetzt möchte ich testen, dass das Viewmodel aktualisiert wird, wenn das Modell das Ereignis auslöst.

[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); 
} 

Beachten Sie, dass dies nur ein Beispiel ist und nicht mein tatsächlicher Code (der komplexer ist). Ich hoffe, Sie können Tippfehler und andere kleine Fehler ignorieren.

Antwort

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); 
} 

Edit: Der Fehler, den Sie wahrscheinlich stoßen kann IModel durch Änderung des Stub-Typs mit einer Schnittstelle gelöst werden (das ist, wie meine eigenen Tests funktionieren). Ich habe es in obigem Beispiel geändert, aber Sie müssen auch die MyViewModel Konstruktordeklaration ändern, um den Schnittstellentyp zu nehmen.

Das Hinzufügen des virtual-Schlüsselworts zur Ereignisdeklaration funktioniert möglicherweise ebenfalls.