2012-01-27 14 views
16

माइक्रोसॉफ्ट टेस्ट फ्रेमवर्क और एमओक का उपयोग करके मैं यह सत्यापित करने की कोशिश कर रहा हूं कि लॉग 4नेट विधि कहलाती है या नहीं।moq सेट अप करना और सत्यापित करना कि विधि को

[TestMethod()] 
    public void Log_Info_When_Stuff_Is_Done() 
    { 
     SampleClass sampleObject = new SampleClass(); 

     Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>(); 

     sampleObject.Log = logMockObject.Object; 

     sampleObject.DoStuffAndLogInfo(); 

     logMockObject.Verify(moqLog => moqLog.Info("do stuff got called"), Times.AtLeastOnce()); 

    } 

मुझे लगता है कि

नकली को अपेक्षित मंगलाचरण में कम से कम एक बार कह कॉल सत्यापित करें पर एक अपवाद मिलता है, लेकिन कभी नहीं प्रदर्शन किया गया था: moqLog => moqLog.Info ("कर सामान लिए बुला लिया गया") कोई सेटअप कॉन्फ़िगर नहीं किया गया। कोई चालान प्रदर्शन नहीं किया।

मैं क्या गलत कर रहा हूं?

अद्यतन समस्या SampleClas.Log प्रॉपर्टी के लिए गेटर के साथ थी। मैं हमेशा LogManager.GetLogger(...); लौटा रहा था, भले ही संपत्ति पहले से ही ILogProxy पर सेट हो। मैं इस धारणा के तहत था कि संपत्ति के एक्सेसर को कॉल नहीं किया जाएगा क्योंकि मैंने sampleObject.Log = logMockObject.Object;

+0

"सामान लिए बुला लिया गया है" है सटीक स्ट्रिंग .info को पारित किया जा रहा? –

+1

'sampleObject.DoStuffAndLogInfo()' क्या करता है? –

+0

नहीं। क्या पैरामीटर मायने रखता है? मैंने सोचा कि पैरामीटर तब तक कोई फर्क नहीं पड़ता जब तक आप इसे कुछ पास नहीं कर रहे हैं। –

उत्तर

1

जैसे प्रॉक्सी स्थापित किया है, परीक्षण सही ढंग से स्थापित है।

sut जांचें कि Log.Info वास्तव में DoStuffAndLogInfo विधि के अंदर बुलाया जाता है या नहीं।

+0

मैं इस उत्तर से सहमत हूं। अपने आप को दिमाग का टुकड़ा देने के लिए, मेरे नमूना क्लास के साथ अपना परीक्षण चलाएं और आप देखेंगे कि आपका परीक्षण सफल हो गया है। 'पब्लिक क्लास नमूना क्लास {सार्वजनिक शून्य लॉग (ILog लॉग) {log.Warn ("सामान कहलाता है"); }} ' –

+0

@ जोहानरूज सही है, मैंने इस तरह के एक वर्ग का भी उपयोग किया है - केवल 'चेतावनी' – GolfWolf

+0

के बजाय यह 'जानकारी' है। मैंने यह परिवर्तन किया लेकिन मुझे भी एक और बदलाव करना पड़ा। कृपया प्रश्न पर मेरा अपडेट देखें। –

32

अभी Moq की पुष्टि करने की जाती है कि सटीक स्ट्रिंग साथ DoStuffAndLogInfo कॉल Info "करते सामान लिए बुला लिया गया।" यह वास्तव में एक अलग तर्क के साथ Info कॉल कर रहा है, और आप परवाह नहीं है क्या वास्तविक तर्क है, का उपयोग करने के बजाय निम्नलिखित:

logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce()); 
+0

समझ में आता है। मैंने यह परिवर्तन किया लेकिन मुझे भी एक और बदलाव करना पड़ा। कृपया प्रश्न पर मेरा अपडेट देखें। –

+0

आपने लॉग के लिए एक मॉक बनाया लेकिन 'नमूना क्लास 'के लिए नहीं। यदि 'SampleClass.DoStuffAndLogInfo'' इस 'लॉग' तक पहुंचता है, तो यह अभी भी 'नमूना क्लास.लॉग' के लिए आपके 'get' accessor को कॉल करेगा। –

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