2010-11-08 13 views
25

राइनो मोक्स का उपयोग करके मैं नकली/स्टब से एक ईवेंट कैसे बढ़ा सकता हूं?राइनो मोक्स का उपयोग करके नकली/स्टब से घटनाओं को बढ़ाना

मुझे वेब पर इस प्रश्न का कुछ जवाब मिल गया है, लेकिन वे सभी रिकॉर्ड/रीप्ले-सिंटैक्स का उपयोग करने लगते हैं, लेकिन मैं व्यवस्था/अधिनियम/सम्मिलन वाक्यविन्यास का उपयोग कर रहा हूं।

कोई सुझाव?

एक छोटी सी उदाहरण ...

की मैं 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 ईवेंट उठाया जाता है।

यह मॉडल वर्ग एक 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; } 
} 

यह जब यह उठाया है मॉडल और अद्यतन पर ValueChanged घटना के लिए ViewModel सुनने।

अब मैं परीक्षण करना चाहता हूं कि जब मॉडल घटना को उठाता है तो व्यूमोडेल अपडेट किया जाता है।

[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 कीवर्ड जोड़ना भी काम कर सकता है।

संबंधित मुद्दे