2011-10-14 5 views
6

के रूप में जटिल वस्तु के साथ एक विधि लौटें मैं अत्यधिक सराहना किसी को नीचे उल्लिखित अंक में मेरी मदद कर सकते करने के लिए: मैं यूनिट टेस्ट में RhinoMock उपयोग कर रहे हैं। मैं sessionToken साथ ऐसे ढंग से मेरी नकली वस्तु को परिभाषित, स्ट्रिंग टाइप है:।RhinoMock: ठूंठ और पैरामीटर

mockRepository.Stub(repository => repository.FindById(sessionToken)).Return(new DeviceTypeRepository().NewTable(false)); 

यह कोड अनुभाग के लिए ठीक है जब FindById()वैध नई नई DeviceTypeRepository वापस जाने के लिए() कॉल है NewTable (असत्य);

हालांकि, जब एक जटिल नीचे के रूप में इस तरह के एक DataTable के रूप में वस्तु के रूप में पैरामीटर,, स्टब में शामिल हैं:

mockRepository.Stub(repository => repository.Find(sessionToken, dataTable)).Return(new DeviceTypeRepository().NewTable(false)); 

फिर कोड खंड जिसमें खोजें() शुरू हो जाती है, यह नहीं करता है वापसी की उम्मीद नई डिवाइसटाइप रिपोजिटरी()। न्यूटेबल (झूठी)। सूचना है कि पैरामीटर DataTable के इनपुट मूल्य दोनों स्टब में और में खोजें() मंगलाचरण में ही है।

इसलिए, मेरा प्रश्न है: मैं RhinoMock का उपयोग कर स्टब प्रारंभिकरण में ऐसे पैरामीटर (डेटाटेबल टाइप और अधिक आम तौर पर) को कैसे कार्यान्वित कर सकता हूं? मैं किसी भी सलाह और दृष्टिकोण के लिए आभारी होंगे। धन्यवाद

+0

'dataTable' के _value_ या एक ही _reference_ है और' खोजें() ': उपयोग की कमी आप क्या कर सकते है? – Jeroen

उत्तर

6

यह वापस नहीं करता है, तो आप क्या उम्मीद थी, तो ठूंठ कॉल और वास्तविक कॉल के बीच मानकों से मेल नहीं खाते। मान लीजिए कि आप कुछ इस तरह करते हैं:

// Set expectations 
var someDataTable = new DataTable(columns, raws); 
mockRepository 
    .Stub(repository => repository.Find(sessionToken, dataTable)) 
    .Return(new DeviceTypeRepository().NewTable(false)); 

// Actual test 
var anotherDataTable = new DataTable(columns, raws); 
yourTestObject.DoSomethingThatLooksForTheDataTable(repository); 

बात यहाँ है कि भले ही someDataTable और anotherDataTable ठीक उसी सामग्री है, वे एक ही वस्तु नहीं कर रहे हैं और जब RhinoMocks वास्तविक को ठूंठ कॉल तुलना फोन पैरामीटर मेल नहीं खाते हैं। दोनों में `स्टब()`

mockRepository 
    .Stub(repository => repository.Find(
     Arg<SessionID>.Matches(y => y.ID == 2), 
     Arg<DataTable>.Matches(x => x.Columns == columns && x.Raws == raws) 
    )) 
    .Return(true); 
+0

क्या RhinoMock की बाधाओं का उपयोग करने का कोई और तरीका है? कुछ समान: mockRepository.Stub (repository => repository.Find (..., ...))। Contraints (Is.EqualTo (x), ...) –

8

मेरा मानना ​​है कि समस्या एक जटिल डेटाप्रकार में बल्कि उम्मीदों सेट किए गए में नहीं है।

, इसे ठीक करने Return से पहले IgnoreArguments() जोड़ने एक पहला प्रयास के रूप में। यह हो सकता है कि DataTable आप उम्मीद में निर्दिष्ट किया है से वास्तव में-पारित कर दिया-इन DataTable उदाहरण तो अलग है उम्मीदों से पारित नहीं होगा:

...Stub(...).IgnoreArguments().Return(); 

तो मदद नहीं आप मैन्युअल रूप से WhenCalled() का उपयोग कर इसे डिबग कर सकते हैं:

...Stub(...).IgnoreArguments().WhenCalled(
    mi => 
    { 
     var token = mi.Arguments[0] as TokenDataType; 
     var dataTable = mi.Arguments[1] as DataTable; 
    }).Return(); 

यदि यह मदद नहीं करता है, के बाद Repeat().Any() जोड़ने का प्रयास करें और देखें कि यह काम करता है या नहीं। मुझे लगता है कि अगर विधि को कुछ बार बुलाया गया था, तो हो सकता है कि आपने पहले रिटर्न वैल्यू को याद किया हो, लेकिन मैं गलत हो सकता हूं।

+0

मुझे WhenCalled उपयोग पसंद आया। हालांकि, स्टब के साथ आपको दोहराना() जोड़ना होगा। कोई भी(), यह डिफ़ॉल्ट व्यवहार है। –

+0

@ अमिताई शपीरा: अच्छा बिंदु, धन्यवाद, दस्तावेज़ीकरण का कोई संदर्भ? मैं ज्यादातर मॉक का उपयोग करता हूं और नकली के लिए यह डिफ़ॉल्ट रूप से दोहराया नहीं जाता – sll

+1

सबूत पूछने के लिए धन्यवाद। मैं गलत था :-(इस मामले में मोजे और स्टब्स का व्यवहार समान है, डिफ़ॉल्ट दोहराया जाता है()। एक बार(): http://groups.google।कॉम/समूह/rhinomocks/Browse_thread/धागा/03aff4992b5607cb –

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