ম্যাক ব্যবহার করে কোনও পদ্ধতি বলা হচ্ছে কিনা তা নির্ধারণ করতে


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();
}

যদি রেখাটি মন্তব্য করা থাকে তবে আপনি যাচাইকরণের ডাক দিলে এটি মকএক্সসেপশন নিক্ষেপ করবে। যদি এটি অনিয়ন্ত্রিত হয় তবে এটি পাস হবে।


7
এটা সঠিক উত্তর. তবে আপনাকে অবশ্যই কিছু বুঝতে হবে। আপনি এমন একটি পদ্ধতি / সম্পত্তির বিদ্রূপ করতে পারবেন না যা বিমূর্ত বা ভার্চুয়াল নয় (স্পষ্টতই, সমস্ত ইন্টারফেস পদ্ধতি এবং বৈশিষ্ট্যগুলি উপহাস করা যায়)।

25
-1: এক্সপেক্ট (...)। যাচাইযোগ্য () এই কোডটিতে অপ্রয়োজনীয়। এএএএ ​​ব্যবহার করে আপনার যাচাই করা ঠিক আছে। । যাচাইযোগ্যটি .V যাচাই করুন () i, .e এর সাথে ব্যবহারের জন্য। কোন আর্গ সংস্করণ। দেখুন stackoverflow.com/questions/980554/...
রুবেন Bartelink


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);

ডাউনবোটেড কারণ এটি আরও জটিল এবং একটি বয়লারপ্লেট ডমিক্লাসের প্রয়োজন
রেগেইগুইটার

upvated কারণ কখনও কখনও আপনি
চুল্লী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.