2009-04-08 18 views
49

का उपयोग कर संपत्ति गेटर पर मैं एक मज़ाक उड़ाया उद्देश्य यह है कि किसी अन्य वस्तु के लिए एक निर्माता तर्क के रूप में पारित हो जाता है की है।राइनो Mocks AssertWasCalled (कई बार) एएए

मैं कैसे जांच कर सकते हैं कि एक मज़ाक उड़ाया वस्तु की संपत्ति बुलाया गया है? इस कोड को मैं वर्तमान में उपयोग कर रहा हूँ है:

INewContactAttributes newContact = MockRepository.GenerateMock<INewContactAttributes>(); 
newContact.Stub(x => x.Forenames).Return("One Two Three"); 
someobject.ConsumeContact(newContact); 
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }); 

यह "someobject" के भीतर forenames संपत्ति पर गेटर कई बार इस्तेमाल किया जाता है जब छोड़कर काम करता है। इसी के साथ मैंने मिलता है "Rhino.Mocks.Exceptions.ExpectationViolationException: INewContactAttributes.get_Forenames(); # अपेक्षित 1, वास्तविक # 2 .."

सीधे शब्दों में

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Any()); 

का उपयोग कर काम नहीं करता है और नीचे त्रुटि देता है :

"उम्मीद प्रतीक्षा उम्मीदों सूची से) हटा दिया गया था, तो आप Repeat.Any (कॉल किया यह AssertWasCalled में समर्थित नहीं है()।"

तो मैं एकाधिक कॉलों को कैसे पूरा करूं?

+1

इसे स्वीकार करने के जवाब में से एक नीचे ✓ क्लिक करें। – lockstock

उत्तर

70

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());

Repeat.Any किसी भी रूप में AssertWasCalled क्योंकि 0 मायने रखता है के साथ काम नहीं करता है .. इसलिए यदि इसे कॉल नहीं किया गया था, तो AsserWasCalled सत्य को वापस लौटाएगा, भले ही इसे नहीं कहा गया हो।

+3

धन्यवाद, यह मुझे समय बचाया। प्रश्न का सबसे अच्छा जवाब होना चाहिए (आईएमओ) – Thies

2

क्या समय की संख्या की जाँच के पीछे आपकी प्रेरणा यह कहा जाता है? क्या यह एक विशेष रूप से महंगा ऑपरेशन है? यदि ऐसा है, तो मैं सुझाव दूंगा कि आप इसे एक विधि के पीछे रख दें, अर्थात् बोलते हुए, संपत्ति सस्ती कॉल होनी चाहिए।

इसके अलावा, कई बार एक संपत्ति कहा जाता है की संख्या की जाँच इकाई परीक्षण का जोर नहीं है (चिंता मत करो यह बहुत अधिक परीक्षण करने के लिए, हम सब वहाँ किया गया है एक आम गलती है)। आपको वास्तव में परीक्षण करना चाहिए कि आपके मॉक ऑब्जेक्ट की स्थिति दी गई है कि विधि अपेक्षित आउटपुट उत्पन्न करती है। ऐसा करने के लिए किसी विधि को बुलाया जाने वाला समय वास्तव में कोई फर्क नहीं पड़ता (जब तक कि यह ईमेल या कुछ भेजने की सेवा न हो)। यह एक कार्यान्वयन विस्तार है जिसे आप सामान्य रूप से परीक्षण नहीं करेंगे क्योंकि एक साधारण रिफैक्टर आपके परीक्षणों को तोड़ देगा क्योंकि वे बहुत विशिष्ट होंगे।

+0

धन्यवाद गैरी। मैं वास्तव में परीक्षण नहीं करना चाहता हूं कि गेटर को कितनी बार बुलाया गया था, केवल इतना ही कहा जाता था। जैसा कि होता है "someobject" इसे आंतरिक रूप से दो बार उपयोग करता है। यही समस्या का कारण है; AssertWasCalled के साथ .pepeat.Any() का उपयोग करने का कोई तरीका नहीं प्रतीत होता है। – Confused

+0

लेकिन आम तौर पर यह सत्यापित करना कि आउटपुट सही है कि संपत्ति को बुलाया गया था। अगर संपत्ति को बुलाया नहीं गया तो आउटपुट सही कैसे हो सकता है? –

+0

गैरी, आपकी टिप्पणियां मान्य हैं, लेकिन आपको यह भी कहना है कि मूल रूप से नकली परीक्षण के दो स्कूल हैं: राज्य-आधारित और बातचीत-आधारित। यह बताते हुए कि विधि को कितनी बार बुलाया जाता है, बातचीत-आधारित परीक्षण में पूरी तरह से मान्य है। और कभी-कभी राज्य नहीं बदलता है। –

0

newContact.Expect (ग => c.ForeNames) .Return (...) .Repeat.Any()

2

राइनो आप उपयोग कर रहे के अपने संस्करण के आधार पर, आप उपयोग कर सकते हैं:

// Call to mock object here 
LastCall.IgnoreArguments().Repeat.Never(); 
26

मैं क्रिस जवाब

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce()); 

साथ ही आप जानते हैं कि वास्तव में कितनी बार संपत्ति के नाम से जाना चाहते हैं के साथ सहमत आप

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Times(n)); 

जहां एन एक int है।

0
Here से

:

mock.AssertWasCalled(x => x.Name ="Bob"); 

या

mock.AssertWasCalled(x => x.Name =Arg.Is("Bob")); 

या

mock.AssertWasCalled(x => x.Name =Arg<string>.Is.NotNull); 
+1

यह उत्तर काम नहीं करेगा, क्योंकि आप एक बार बुलाए जाने वाले तरीके पर जोर देंगे। सवाल यह कहने के बारे में है कि विधि को कई बार बुलाया गया था। – Peter

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