2014-04-18 8 views
11

के साथ एक ठोस वर्ग मजाक कैसे अंतरफलक तर्क के साथ निर्माता कॉल करनी होगी निम्नलिखित वर्ग है, जो निर्माता इंजेक्शन का उपयोग करता है:मैं जब Moq

public class Service : IService 
{ 
    public Service(IRepository repository, IProvider provider) { ... } 
} 

इस वर्ग में सबसे विधियों के लिए, मैं बस Moq बनाने IRepository के लिए मजाक उड़ाता है और IProvider और Service का निर्माण। हालांकि, कक्षा में एक विधि है जो एक ही कक्षा में कई अन्य विधियों को बुलाती है। इस विधि का परीक्षण करने के लिए, उन सभी विधियों को एकसाथ परीक्षण करने के बजाय, मैं यह जांचना चाहता हूं कि विधि उन विधियों को सही तरीके से कॉल करे और उनके वापसी मूल्यों को सही ढंग से संसाधित करे।

ऐसा करने का सबसे अच्छा तरीका Service नकल करना है। मैंने बिना किसी मुद्दे के पहले मक के साथ ठोस वर्गों का मज़ाक उड़ाया है। मैंने कंक्रीट कक्षाओं का भी मज़ाक उड़ाया है जिसके लिए बिना किसी मुद्दे के मोक के साथ कन्स्ट्रक्टर तर्क की आवश्यकता है। हालांकि, यह पहली बार है जब मुझे को मैक किए गए ऑब्जेक्ट के लिए कन्स्ट्रक्टर में तर्कों को पारित करने की आवश्यकता है। स्वाभाविक रूप से, मैंने इसे इस तरह से करने की कोशिश की:

var repository = new Mock<IRepository>(); 
var provider = new Mock<IProvider>(); 

var service = new Mock<Service>(repository.Object, provider.Object); 

हालांकि, यह काम नहीं करता है। इसके बजाय, मैं निम्नलिखित त्रुटि मिलती है:

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: My.Namespace.Service. 
Could not find a constructor that would match given arguments: 
    Castle.Proxies.IRepository 
    Castle.Proxies.IProvider 

यह ठीक काम करता है अगर Service के निर्माता int और string रों की तरह साधारण तर्क लेता है, लेकिन नहीं करता है, तो यह इंटरफेस है कि मैं मजाक कर रहा हूँ लगता है। आप यह कैसे करते हैं?

+1

आप किस मक और महल संस्करण का उपयोग कर रहे हैं? चूंकि आपका नमूना कोड Moq 4.2.1312.1622 और Castle.Core 3.2.2 का उपयोग कर ठीक काम कर रहा है ... – nemesv

उत्तर

4

मुझे एक बहुत ही समस्या थी जब Service के बराबर एक आंतरिक कन्स्ट्रक्टर था, इसलिए यह मोक को दिखाई नहीं दे रहा था।

कार्यान्वयन के लिए मैं इस परियोजना के लिए मेरी AssemblyInfo.cs फ़ाइल को

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

गयी। यह सुनिश्चित नहीं है कि यह प्रासंगिक है, लेकिन मैं इस अवसर पर एक सुझाव जोड़ना चाहता था कि यह आपको या किसी और की मदद करे।

1

यह पुराना संस्करण मुद्दा होना चाहिए, सभी नवीनतम संस्करण के साथ ठीक है। निक, कृपया जांचें!

पीएस .: मैंने गलत तरीके से बक्षीस शुरू किया (मेरे निर्माता में गलत हस्ताक्षर था)।

3

आप जिस सेवा का परीक्षण कर रहे हैं उसका मज़ाक उड़ा रहे हैं? यदि आप सेवा वर्ग के कार्यान्वयन की जांच करना चाहते हैं (चाहे वह मजाकिया वस्तुओं पर कॉल हो या नहीं), तो आपको केवल दो इंटरफेस के लिए मोक्स हैं, टेस्ट क्लास नहीं।

var repository = new Mock<IRepository>(); 
var provider = new Mock<IProvider>(); 

var service = new Mock<Service>(repository.Object, provider.Object); 

यह इस बजाय नहीं चाहिए:

बजाय

?

var repository = new Mock<IRepository>(); 
var provider = new Mock<IProvider>(); 

var service = new Service(repository.Object, provider.Object); 

मुझे पता है यह संभव कुछ चौखटे में ठोस वस्तुओं उपहास करने के लिए है, लेकिन अपने इच्छित उद्देश्य क्या है? कुछ मजाक करने का विचार वास्तविक कार्यान्वयन को दूर करना है ताकि यह आपके परीक्षण को प्रभावित न करे। लेकिन आपके प्रश्न में, आपने कहा है कि आप जानना चाहते हैं कि कुछ वर्गों को सही तरीके से बुलाया जाता है, और फिर आप उन कार्यों के परिणामों को प्रमाणित करना चाहते हैं। निस्संदेह कार्यान्वयन का परीक्षण कर रहा है, और इसी कारण से, मुझे ठोस वस्तु का मज़ाक उड़ाते हुए लक्ष्यों को देखने में कठिनाई हो रही है।