एक विधि कहा जाता है यह निर्धारित करने के लिए Moq का उपयोग करना


159

यह मेरी समझ है कि मैं परीक्षण कर सकता हूं कि यदि मैं उच्च स्तर की विधि कहता हूं, तो एक विधि कॉल आएगी:

public abstract class SomeClass()
{    
    public void SomeMehod()
    {
        SomeOtherMethod();
    }

    internal abstract void SomeOtherMethod();
}

मैं परीक्षण करना चाहता हूं कि अगर मैं फोन करता SomeMethod()हूं तो मुझे उम्मीद है कि SomeOtherMethod()बुलाया जाएगा।

क्या मैं यह सोचने में सही हूं कि इस तरह का परीक्षण एक नकली रूपरेखा में उपलब्ध है?

जवाबों:


186

आप देख सकते हैं कि क्या आपके द्वारा नकल की गई किसी विधि को वैरिफाई, उदाहरण के लिए उपयोग करके बुलाया गया है:

static void Main(string[] args)
{
        Mock<ITest> mock = new Mock<ITest>();

        ClassBeingTested testedClass = new ClassBeingTested();
        testedClass.WorkMethod(mock.Object);

        mock.Verify(m => m.MethodToCheckIfCalled());
}

class ClassBeingTested
{
    public void WorkMethod(ITest test)
    {
        //test.MethodToCheckIfCalled();
    }
}

public interface ITest
{
    void MethodToCheckIfCalled();
}

यदि लाइन को छोड़ दिया जाता है तो यह सत्यापित किया जाता है कि जब आप Verify कहते हैं तो यह MockException को फेंक देगा। यदि इसे अपूर्ण किया गया तो यह पारित हो जाएगा।


7
यह सही जवाब है। हालाँकि आपको कुछ समझना चाहिए। आप एक ऐसी विधि / संपत्ति का मजाक नहीं उड़ा सकते जो अमूर्त या आभासी न हो (जाहिर है, सभी इंटरफ़ेस विधियों और गुणों का मजाक उड़ाया जा सकता है)।

25
-1: The .Exect (...)। वेरिफायबल () इस कोड में बेमानी है। AAA का उपयोग करके आपके पास जो सत्यापन है वह सही है। । उपयोगी के साथ प्रयोग के लिए है। सत्यापित करें () i, .e कोई arg संस्करण। देखें stackoverflow.com/questions/980554/…
रूबेन बार्टेलिंक

@
I--

6

नहीं, मॉक टेस्टिंग यह मानती है कि आप कुछ परीक्षण योग्य डिज़ाइन पैटर्न का उपयोग कर रहे हैं, जिनमें से एक इंजेक्शन है। आपके मामले में आप परीक्षण कर रहे होंगे SomeClass.SomeMethod और SomeOtherMethodकिसी अन्य संस्था में लागू किया जाना चाहिए जिसे हस्तक्षेप करने की आवश्यकता है।

आपका Someclassकंस्ट्रक्टर जैसा दिखेगा New(ISomeOtherClass)। तब आप उम्मीद करेंगे ISomeOtherClassकि इस पर SomeOtherMethodबुलाए जाने और अपेक्षा को सत्यापित करने के लिए उम्मीद को नकली किया जाएगा।


0

भले ही मैं इस बात से सहमत हूं कि @ पॉल का जवाब जाने का अनुशंसित तरीका है कि मैं केवल एक वैकल्पिक तरीका जोड़ना चाहता हूं जो moqस्वयं द्वारा प्रदान किया गया हो।

के बाद से SomeClassहै abstractयह वास्तव में mockable है, लेकिन public void SomeMehod()नहीं है। मुद्दा यह है कि नकल करने का तरीका ढूंढा जाए और किसी तरह उस तरीके को लागू किया जाए और फिर CallBaseकॉल को प्रचारित किया जाए SomeOtherMethod()। यह एक हैक के रूप में लग सकता है लेकिन यह सार में सरल है। इसका उपयोग इस मामले में किया जा सकता है यदि प्रस्तावित रीफैक्टरिंग संभव नहीं है।

// This class is used only for test and purpose is make SomeMethod mockable
public abstract class DummyClass : SomeClass
{
    public virtual void DummyMethod() => base.SomeMethod();
}

तब आप ध्वज DummyMethod()को सेट करके कॉल को प्रचारित करने के लिए सेटअप कर सकते थे CallBase

//Arrange
var mock = new Mock<DummyClass>();
mock.Setup(m => m.DummyMethod()).CallBase();

//Act
mock.Object.SomeMethod();

//Assert
mock.Verify(m => m.SomeOtherMethod(), Times.Once);

डाउनवोटेड क्योंकि यह अधिक जटिल है और इसे बॉयलरप्लेट की आवश्यकता है डमीक्लास
रेगेगिटेरिटी

अपवित्र क्योंकि कभी-कभी आप
रिफ्लेक्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.