2010-04-05 13 views
6

Moq डेवलपर्स को संरक्षित सदस्यों को नकल करने की अनुमति देता है। मैं Rhino.Mocks में एक ही कार्यक्षमता की तलाश में था लेकिन इसे ढूंढने में विफल रहा।Rhino.Mocks के साथ संरक्षित आभासी सदस्यों को नकल कैसे करें?

यहां Moq Quick Start पृष्ठ से संरक्षित विधि को नकल करने का उदाहरण दिया गया है।

// at the top of the test fixture 
using Moq.Protected() 

// in the test 
var mock = new Mock<CommandBase>(); 
mock.Protected() 
    .Setup<int>("Execute") 
    .Returns(5); 

// if you need argument matching, you MUST use ItExpr rather than It 
// planning on improving this for vNext 
mock.Protected() 
    .Setup<string>("Execute", 
     ItExpr.IsAny<string>()) 
    .Returns(true); 

मुझे बताएं कि क्या मैं कुछ ऐसा पीछा कर रहा हूं जो बाहर नहीं निकलता है।

+0

आप हो सकता है कि यह लिंक देखना चाहें http://geekswithblogs.net/MattRobertsBlog/archive/2008/12/16/how-to-make-a-quotprotectedquot-method-available-for-quotpartialquot-mocking-and-again.aspx – juharr

+2

यह वास्तव में एक उपयुक्त समाधान नहीं है - अन्य कक्षाओं में आंतरिक रूप से एक विधि का पर्दाफाश करने के लिए अपनी मूल कक्षा को बदलना है ईन्स आप परीक्षण के लिए पूरा करने के लिए अपने डिजाइन में बदलाव कर रहे हैं। मेरे लिए खराब गंध –

उत्तर

4

मेरा मानना ​​है कि यह कार्यक्षमता राइनो मोक्स में मौजूद नहीं है।

आप संरक्षित सदस्यों का नकल करने की कोशिश क्यों कर रहे हैं? पूरी तरह कक्षा का परीक्षण क्यों न करें? वैकल्पिक रूप से आप अपनी टेस्ट क्लास का उप-वर्ग बना सकते हैं और मैन्युअल रूप से "मॉक" संरक्षित विधियां बना सकते हैं।

+0

मैं वर्तमान में SUT subclassing और संरक्षित सदस्य नकली हूँ। मैं सोच रहा था कि मोक में ऐसा कुछ है जो मुझे सबक्लासिंग से बचाएगा। मैं मानता हूं कि राइनो.मोक्स में यह कार्यक्षमता नहीं है। – Vadim

+0

क्योंकि माइक्रोसॉफ्ट के पास इस तरह की चीजें हैं। ... संरक्षित आंतरिक आभासी OkResult ठीक() { } –

2

हम internal रूप protected विधि बनाते हैं और फिर इकाई परीक्षण परियोजना के लिए आंतरिक बेनकाब और राइनो अपने AssemblyInfo को निम्नलिखित लाइनों को जोड़कर का मजाक उड़ाता है:

[assembly: InternalsVisibleTo("YourNamespace.TestProjectName")] 
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

हमारे लिए एक इलाज काम करता है

+0

केथ, धन्यवाद, लेकिन मैं कुछ अन्य समाधान ढूंढ रहा था और फिर मेरी असेंबलीइन्फो को संशोधित कर रहा था। बीटीडब्ल्यू। लगभग 5 साल पहले मैंने एक उपयोगिता बनाई जो आपके लिए आंतरिक दृश्यमान कोड उत्पन्न करता है। यह आपको कुछ समय बचा सकता है। आप इसे यहां पा सकते हैं: http://vkreynin.wordpress.com/2007/12/09/testing-internals-members-with-internalsvisibleto-attribute/ – Vadim

+0

@ वादिम अच्छा धन्यवाद आदमी, मेरा मानना ​​है कि वीएस2012 आपको कुछ भी नकल करने की अनुमति देता है अगली पीढ़ी के यूनिट परीक्षणों के लिए यह समस्या मौजूद नहीं हो सकती है! – keith

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