2011-07-28 19 views
15

का उपयोग कर आंतरिक प्रकार के लिए एक मॉक क्लास नहीं बना सकता है, मैं इकाई परीक्षण के लिए एक मॉकिंग फ्रेमवर्क के रूप में राइनो मोक्स का उपयोग कर रहा हूं।राइनो मोक्स

मेरे पास विषय कहा जाता है जिसे कक्षा मैं परीक्षण करना चाहता हूं। यह इस्तौर पर निर्भरता है।

//internal interface : has InternalsVisible to both "Subject" 
//and "StoreTests" class namespaces 
internal interface IStore { 
    void Store(string name); 
    //other methods 
} 

और विषय वर्ग इस प्रकार परिभाषित किया गया है:

iStore इस प्रकार परिभाषित किया गया है

class Subject : IStore { 
    private IStore internalStore; 

    //constructor injection 
    void Subject(IStore store) { 
     internalStore = store; 
    } 

    void Store(string name) { 
     internalStore.Store(name); 
    } 

    //other methods 
} 

मेरा परीक्षण वर्ग RhinoMocks का उपयोग कर इस प्रकार है:

//test class 
class StoreTests { 
    Subject subject = new Subject(); 

    [Test] 
    public StoreTest() { 
     //Arrange 
     var mockStore = MockRepository.GenerateMock<IStore>(); 
     string testName = "test"; 
     mockStore.Expect(x => x.Store(testName)).Returns(null); 

     //Act 
     subject.Store(testName); 

     //Assert 
     mockStore.VerifyAllExpectations(); 
    } 

    //other test methods 
} 

में मेरा सेटअप, इंटरफ़ेस को आंतरिक के रूप में परिभाषित किया गया है और इसमें विषय वर्ग और स्टो दोनों के लिए आंतरिक दृश्य सेट है कक्षा में retests। हालांकि, जब परीक्षण केस निष्पादित होता है, तो यह var mockStore = MockRepository.GenerateMock() पर अपवाद फेंकता है; कह रहा है कि इस्तौर सार्वजनिक नहीं है और इसलिए यह एक नकली उत्पन्न नहीं कर सका।

मुझे लगता है कि ऐसा इसलिए है क्योंकि आईएसटीओआर सार्वजनिक नहीं है। हालांकि, चूंकि मैंने आईएसटीओआर डीएल पर आंतरिक दृश्यों को सेट किया है, तो क्या स्टोरस्टेस्ट के लिए उस वर्ग के लिए नकली बनाने के लिए पर्याप्त नहीं होगा?

अब मुझे लगता है कि इस समस्या को आईएसटीओआर इंटरफ़ेस सार्वजनिक बनाकर हल किया जा सकता है। हालांकि यह देखते हुए कि यह मेरे लिए कोई विकल्प नहीं है, क्या कोई अन्य तरीका है कि मैं इस्तोर के लिए नकली बना सकता हूं?

उत्तर

27

आप विधानसभा internals राइनो का मजाक उड़ाता को दिखाई बनाने की कोशिश की?

[assembly: InternalsVisibleTo ("DynamicProxyGenAssembly2")] 

विवरण के लिए Rhino Mocks Internal Members देखें।

जब एक वर्ग का मज़ाक उड़ाया जाता है, तो रन-टाइम पर एक नई कक्षा उत्पन्न होती है जो मॉक क्लास से ली जाती है। यह जेनरेट क्लास एक अलग "अस्थायी" असेंबली में रहता है जिसे "डायनेमिकप्रॉक्सिजेनएस्परब्स 2" कहा जाता है। इसलिए, आंतरिक दृश्यों को अस्थायी असेंबली से अपने आंतरिक सदस्यों तक पहुंच की अनुमति देने के लिए लक्षित असेंबली पर सेट करने की आवश्यकता है; अन्यथा, नकली वस्तु आंतरिक सदस्य को ओवरराइड नहीं कर सकती है क्योंकि इसकी पहुंच तक नहीं है (यही कारण है कि मॉक विधि को वर्चुअल के रूप में चिह्नित किया जाना चाहिए)। ध्यान दें कि यह सच है भले ही इकाई परीक्षण और परीक्षण कक्षा एक ही असेंबली में हों।

तो, आप यह सुनिश्चित करें कि लक्ष्य वर्ग 'विधानसभा में इस तरह के रूप में अपनी आंतरिक प्रॉक्सी विधानसभा को दिखाई बनाता है (उदाहरण के लिए AssemblyInfo.cs में) बनाने की जरूरत है:

+1

लिंक के लिए धन्यवाद! यह अब काम करता है। – Santhosh

10

हाँ यह AssemblyInfo.cs में निम्नलिखित एक विधानसभा का फ़ाइल परीक्षण के अंतर्गत जोड़ने के लिए पर्याप्त होना चाहिए:

[assembly: InternalsVisibleTo("Tests.Assembly.Name")] 
[assembly: InternalsVisibleTo("NUnit.Framework")] 
[assembly: InternalsVisibleTo("Rhino.Mocks, PublicKey=00240000048000009400000006020000002400005253413100040000010001009D1CF4B75B7218B141AC64C15450141B1E5F41F6A302AC717AB9761FA6AE2C3EE0C354C22D0A60AC59DE41FA285D572E7CF33C320AA7FF877E2B7DA1792FCC6AA4EB0B4D8294A2F74CB14D03FB9B091F751D6DC49E626D74601692C99EAB7718ED76A40C36D39AF842BE378B677E6E4EAE973F643D7065241AD86ECC156D81AB")] 
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] 
+0

यह उत्तर भी ठीक है। दूसरे को स्वीकार करने के रूप में चिह्नित करना, सिर्फ इसलिए कि यह विकी में अतिरिक्त जानकारी के लिए एक लिंक प्रदान करता है। – Santhosh

3

खैर यह उत्तर दिया जाना सकता है, लेकिन के लिए मैं यह काम नहीं किया।

तो यहां मैंने यह काम करने के लिए किया है (अगली परियोजना पर दूसरों की मदद कर सकता है, और यहां तक ​​कि मुझे भी ....):

दृश्य स्टूडियो में उपकरण मेनू में: बाहरी उपकरण: नाम के लिए मैं "LongStrongName" डाल जोड़े, लेकिन डाल जो कुछ भी आप फिट महसूस:

(इस पथ, या जहाँ भी sn.exe के लिए है आप):

+०१२३५१६४१०६१:

Command: 
    C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\sn.exe 
Arguments: 
    -Tp $(TargetPath) 

(, उत्पादन "उत्पादन विंडो का उपयोग करें" के लिए)

अब आप इस परियोजना पर क्लिक कर सकते हैं तो उपकरण पर जाएं और "LongStrongName" मेनू पर जाएं चेकबॉक्स क्लिक करें

Public key is  0240000048000009400000006020000002400005253413100040000010001009badbe86c32ec0 
ec429f0b3909********* 

Public key token is 6ccc051******** 

ओपन assembly.cs और जोड़ें::

और वी.एस. उत्पादन होगा

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] 

जोड़ने जो कुछ विधानसभाओं आप की जरूरत है, और देखा (मैं कई विधानसभाओं डाल करने के लिए किया था)।