Moq ऑब्जेक्ट पैरामीटर के साथ सत्यापित करता है


86

मैं एक पैरामीटर को सत्यापित करने की कोशिश कर रहा हूं जो एक वर्ग है। परीक्षण किया जा रहा कोड ठीक है। बग परीक्षण में है।

मैंने दो तरीके आजमाए हैं, जिनमें से दोनों विफल रहे हैं।

यहाँ मेरे प्रयास हैं:

1:

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions()
    {
        Width = 256,
        Height = 256,
    }));

यह हमेशा विफल रहता है, भले ही एक ऑब्जेक्ट दूसरे पैरामीटर के बराबर पास हो। पहला पैरामीटर ठीक सत्यापित है।

2:

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>()))
    .Callback<byte[], ImageFilterOptions>((data, options) =>
        {
            Assert.AreEqual(this.UploadedFileData, data, "data");
            Assert.AreEqual(filterOptions.Width, options.Width, "Width");
            Assert.AreEqual(filterOptions.Height, options.Height, "Height");
        }
    );

यह हमेशा गुजरता है, तब भी जब इसे असफल होना चाहिए। कॉलबैक में शामिल होने वाले असफल हो जाते हैं, लेकिन अपवाद बाहरी संदर्भ में पारित नहीं किया जाता है, और इस प्रकार परीक्षण हमेशा पास होता है।

क्या आप मेरी मदद कर सकते हैं कि मैं क्या गलत कर रहा हूँ?

जवाबों:


138

पहला प्रयास उस चीज के करीब है जिसे आप प्राप्त करना चाहते हैं।

यह विफल होने का कारण यह है कि Moq (शायद) Object.Equalsपरीक्षण के तहत उपयोग करता है यदि ImageFilterOptionsपैरामीटर जिसे विधि के साथ बुलाया गया था वह उसी उदाहरण के रूप में है जिसे आपने कॉल में आपूर्ति की थी Verify

उनके लिए एक ही उदाहरण होना असंभव है, क्योंकि Verifyआप एक में बनाते हैं new ImageFilterOptions()

पैरामीटर जांच इस तरह से करने के बजाय, आप It.Isएक अभिव्यक्ति प्रदान करने के लिए Moq के सिंटैक्स का उपयोग कर सकते हैं जो पैरामीटर की पुष्टि करता है कि अपेक्षित था।

आपके मामले में, आप यह जांचना चाहते हैं कि पैरामीटर किस प्रकार का है ImageFilterOptionsऔर दोनों Widthऔर Heightसेट हैं 256। अभिव्यक्ति है कि आप ऐसा करने की अनुमति देता है:

It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)

तो, आपकी कॉल Verifyइस तरह दिख सकती है:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));

1
मुझे जो सिंटैक्स इस्तेमाल करना था वह होगा It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256):। कोई भी सामान्य नहीं थाIs
स्टेनिस्लाव

1
जेनेरिक संस्करण मेरे लिए काम करता है और API डॉक्स nudoq.org/#//Packages/Moq/Moq/It/M/Is(TValue) में है - क्या आप Moq के पुराने संस्करण का उपयोग कर रहे हैं?
टिम एबेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.