2015-06-30 8 views
6

में किसी अन्य विधि से क्लासए में विधि को कॉल किया गया है, तो परीक्षण करना संभव है कि Moq and dependency injection का उपयोग करके किसी विधि को कॉल किया गया है या नहीं। हालांकि, क्या यह जांचना संभव है कि कक्षा में एक विधि एक ही कक्षा में किसी अन्य को कॉल करे?क्लास ए

उदाहरण के लिए, मैं परीक्षण करना चाहता हूं कि अगर मैं एक निश्चित अपवाद लॉग करता हूं, तो एक सूचना संदेश भी लॉग होता है।

विधि है:

public void Error(string message, Exception exception, long logId = 0) 
{ 
    var int32 = (int)logId; 
    Info("Id was converted to an int so that it would fit in the log: " + logId, int32); 
    Error(message, exception, int32); 
} 

इस इकाई पर मेरे प्रयास यह परीक्षण किया गया था। परीक्षण विफल रहता है, क्या ऐसा कोई तरीका है कि यह किया जा सकता है?

void logging_an_error_with_a_long_id_also_logs_info() 
{ 
    var mock = new Mock<ILogger>(); 
    var testedClass = new Logger(); 
    var counter = 0; 

    testedClass.Error("test" + counter++, new Exception("test" + counter), Int64.MaxValue); 

    mock.Verify(m => m.Info(It.IsAny<string>(), It.IsAny<int>())); 
} 

के बाद से Info और Error तरीकों एक ही कक्षा (ClassA) में कर रहे हैं, मुझे नहीं लगता कि मैं ClassA में एक निर्भरता के रूप में ClassA पारित कर सकते हैं। तो क्या इसे परीक्षण की आवश्यकता नहीं है?

+0

एक नज़र डालें [यहां] (http://stackoverflow.com/questions/1417048/how-to-verify-another-method-in-the-class-was-called-using-moq)। – dee

उत्तर

7

सबसे अच्छा आप करने में सक्षम होने के लिए Infovirtual बनाना है। यह आपको Mock<Logger> बनाने की अनुमति देगा, CallBase = true सेट करें, और सत्यापित करें कि Info कहा गया था।

var mock = new Mock<Logger> 
{ 
    CallBase = true 
}; 

mock.Object.Error("test" + counter++, new Exception("test" + counter), Int64.MaxValue); 

mock.Verify(m => m.Info(It.IsAny<string>(), It.IsAny<int>())); 

इस तरह, आप अभी भी Error के वास्तविक क्रियान्वयन कॉल कर रहे हैं, लेकिन आप Moq का उपयोग किया है Info विधि बुलाया गया था सत्यापित करने के लिए।

+0

+1 यह काम करता है जब मॉक का उपयोग किया जाता है क्योंकि असली कक्षा की आवश्यकता होती है। इंटरफ़ेस मॉक के लिए काम नहीं करता है। – dee

5

ऐसा लगता है कि आप गलत चीज़ का परीक्षण करने की कोशिश कर रहे हैं। यह वास्तव में महत्वपूर्ण नहीं है कि Info आपकी कक्षा पर विधि Error विधि से कहा जाता है, यह महत्वपूर्ण है कि Info विधि का व्यवहार होता है। यह कैसे होता है कक्षा का कार्यान्वयन विवरण।

अगर मैं दो कार्यों के साथ एक गणित वर्ग था:

public int Mult(int x, int y) { 
    return x*y; 
} 

public int Sqr(int x) { 
    return Mult(x,y); 
} 

मैं परीक्षण नहीं होता है कि SqrMult कार्य करने के लिए बाहर बुलाया बुला, मैं Sqr(4)==16 का परीक्षण होगा। इससे कोई फर्क नहीं पड़ता कि यह गणना एसक्यूआर विधि में या कक्षा के किसी अन्य तरीके में होती है।

@ एंड्रयू के solution शायद आप जो भी कर रहे हैं, उस वर्ग का मज़ाक उड़ाते हुए आप कसकर युग्मित, भंगुर परीक्षणों का नेतृत्व कर सकते हैं।

यदि यह दुष्प्रभावों को देखकर कॉल का परीक्षण करने के लिए अव्यवहारिक है, तो यह एक संकेत हो सकता है कि कार्यान्वयन कुछ रिफैक्टरिंग का उपयोग कर सकता है।

+0

यह कहना आसान है कि बेहतर तरीके से – Hoppe

+0

@ होपपे बेहतर तरीके से प्रदान करने के मुकाबले बेहतर तरीका है, जबकि यह सही है, एक बेहतर तरीका प्रदान करने के लिए अक्सर प्रदान किए जाने से अधिक संदर्भ की आवश्यकता होती है (उदाहरण के लिए मुझे नहीं पता कि आपकी सामग्री क्या है त्रुटि या जानकारी विधियां है)। कभी-कभी सबसे अच्छा किया जा सकता है कि एक वैकल्पिक दिशा को इंगित करना है, जो कुछ में एक दरवाजा खुल जाएगा जो उन्हें अपनी समस्या को अलग तरीके से देखने की अनुमति देगा .. – forsvarir

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