2010-11-08 9 views
25

Comment puis-je déclencher un événement à partir d'un faux/stub en utilisant Rhino Mocks?Élever des événements à partir d'un faux/stub en utilisant Rhino Mocks

J'ai trouvé quelques réponses à cette question sur le web, mais elles semblent toutes utiliser la syntaxe Record/Replay, mais j'utilise la syntaxe Arrange/Act/Assert.

Des suggestions?

Un petit exemple ...

Disons que j'utilise le modèle MVVM et cette classe modèle:

public class MyModel 
{ 
    private int _myValue; 

    public event EventHandler ValueChanged; 

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

Comme vous pouvez le voir la classe a une valeur entière et une méthode le définit. Lorsque la valeur est définie, un événement ValueChanged est déclenché.

Cette classe de modèle est utilisé par un viewmodel:

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

Ce viewmodel écouter l'événement ValueChanged sur le modèle et les mises à jour quand il est élevé.

Maintenant, je veux tester que le modèle de vue est mis à jour lorsque le modèle soulève l'événement.

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

Notez qu'il ne s'agit que d'un exemple et non de mon code actuel (ce qui est plus complexe). J'espère que vous pouvez ignorer les fautes de frappe et autres petites erreurs.

Répondre

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: L'erreur que vous rencontrez peut probablement être résolu en changeant le type de talon à une interface IModel (qui est la façon dont mes propres tests de travail). Je l'ai modifié dans l'exemple ci-dessus, mais vous devrez également modifier la déclaration constructeur MyViewModel pour prendre le type d'interface. Ajouter le mot-clé virtual à la déclaration d'événement peut également fonctionner.