2010-06-25 14 views
17

मैं _mocks.ReplayAll() पर कॉल करता हूं, फिर एक या अधिक _mockedObject.AssertWasCalled() और फिर _mocks.VerifyAll()। लेकिन यह मुझे बताता है कि "यह क्रिया अमान्य है जब मॉक ऑब्जेक्ट रिकॉर्ड स्थिति में है"।Rhino.Mocks AssertWasCalled() का उपयोग कैसे करें?

[Test] 
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused() 
{ 
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused }; 
    _taskDataProvider.Expect(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused)); 
    _mockRepository.ReplayAll(); 
    _manager.SetStateExecuting(task); 
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, 
                    TaskState.Executing)); 
    _mockRepository.VerifyAll(); 
} 

तो कॉल करने के लिए कि इन तरीकों सही ढंग से काम को सही क्रम क्या है?

उत्तर

-1

ऐसा लगता है जैसे मुझे समाधान मिला। यह थोड़ा अजीब लगता है, लेकिन यह काम करता है। ऐसा लगता है कि मैं) दो बार किसी कारण से ReplayAll (कॉल करने की आवश्यकता ...

यह काम करता है:

[Test] 
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused() 
{ 
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused }; 
    _mockRepository.ReplayAll(); 
    _manager.SetStateExecuting(task); 
    _taskDataProvider.AssertWasCalled(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused)); 
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, TaskState.Executing)); 
    _mockRepository.ReplayAll(); 
} 
+2

नमस्ते, दिखाने के लिए कि कैसे आप _manager की घोषणा कर रहे हैं उपयोगी हो सकता है

यहाँ जॉन की नमूना कोड से उदाहरण हैं आदि। मुझे सामान्य रूप से इसे इतना जटिल बनाने की आवश्यकता नहीं होती है। यह भी देखकर कि आप जिस कोड का परीक्षण कर रहे हैं वह उपयोगी हो सकता है। यदि आप राइनो मोक्स की मदद करना चाहते हैं तो मुझे कहना होगा कि मुझे सहकर्मियों से मदद मिली है, लेकिन "द आर्ट ऑफ यूनिट टेस्टिंग" पुस्तक से http://www.manning.com/osherove/ – ArtificialGold

12

आप पुराने रिकॉर्ड/खेलना पैटर्न और नई AAA pattern मिश्रण कर रहे हैं।

एक "इन तर्कों के साथ कॉल नहीं" उम्मीद स्थापित करने के लिए है, जबकि रिकार्ड में मोड इस तरह दिखता है सामान्य तरीके:

_taskDataProvider.Expect(
    p => p.GlobalStateUpdate(task.ID, TaskState.Executing)).Repeat.Never(); 

या वैकल्पिक रूप से, आप एक सख्त नकली जो केवल अप्रत्याशित की अनुमति नहीं है का उपयोग कर सकते कहता है।

AssertWasCalled और AssertWasNotCalled एएए के लिए लक्षित हैं जहां आप अंत में अपने दावे डालते हैं। रिकॉर्ड/रीप्ले सिंटैक्स के साथ, रीप्ले मोड में स्विच से पहले शुरुआत में व्यवहार और निष्पादन दोनों ही सेट किए जाने चाहिए।

(AssertWasNotCalled वास्तव में भी रिकार्ड/रिप्ले के साथ काम कर सकते हैं, लेकिन मैं इसे करने की कोशिश की, क्योंकि मैं दोनों दृष्टिकोण से तत्वों का मिश्रण करना पसंद नहीं है कभी नहीं। यह बेकार बातें पेचीदा हो।)

16

जॉन क्रूगर के ब्लॉग पोस्ट "How to use rhino mocks documented through tests" सरल है गैंडो मोक्स विधियों के साथ आप जो कुछ भी कर सकते हैं उसके उदाहरण। वह यह भी दिखाता है कि आप क्या नहीं कर सकते जो मुझे सीखने में बहुत मददगार पाया।

जैसा कि पहले बताया गया है, व्यवस्थित रचनाकारों के साथ व्यवस्था, अधिनियम, सम्मिलन सिंटेक्स का उपयोग करना आसान है। ब्लॉग पोस्ट दोनों तरीकों के उदाहरण दिखाता है।

नई वाक्य रचना:

[Test] 
    public void You_can_check_to_see_if_a_method_was_called() 
    { 
     var stub = MockRepository.GenerateStub<ISampleClass>(); 

     stub.MethodThatReturnsInteger("foo"); 

     stub.AssertWasCalled(s => s.MethodThatReturnsInteger("foo")); 
     stub.AssertWasCalled(s => s.MethodThatReturnsInteger(Arg<string>.Is.Anything)); 
    } 

पुरानी शैली:

[Test] 
    public void Calling_virtual_methods_will_call_the_actual_method() 
    { 
     var mockRepository = new MockRepository(); 
     var sampleClass = mockRepository.PartialMock<SampleClass>(); 
     sampleClass.Replay(); 

     sampleClass.VirtualMethod("foo").ShouldEqual(3); 
     sampleClass.VirtualMethodWasCalled.ShouldBeTrue(); 
     sampleClass.AssertWasCalled(c => c.VirtualMethod("foo")); 
    } 

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

  • कोई संबंधित समस्या नहीं^_^