মোক এর সাথে সম্প্রসারণের পদ্ধতিগুলি উপহাস করা


174

আমার একটি প্রিফিক্সিং ইন্টারফেস আছে ...

public interface ISomeInterface
{
    void SomeMethod();
}

এবং আমি এই মিশ্রণটি একটি মিশ্রিন ব্যবহার করে প্রসারিত করেছি ...

public static class SomeInterfaceExtensions
{
    public static void AnotherMethod(this ISomeInterface someInterface)
    {
        // Implementation here
    }
}

আমার এই ক্লাসটি রয়েছে যা আমি যা পরীক্ষা করতে চাই ...

public class Caller
{
    private readonly ISomeInterface someInterface;

    public Caller(ISomeInterface someInterface)
    {
        this.someInterface = someInterface;
    }

    public void Main()
    {
        someInterface.AnotherMethod();
    }
}

এবং এমন একটি পরীক্ষা যেখানে আমি ইন্টারফেসটিকে উপহাস করতে এবং এক্সটেনশন পদ্ধতিতে কলটি যাচাই করতে চাই ...

    [Test]
    public void Main_BasicCall_CallsAnotherMethod()
    {
        // Arrange
        var someInterfaceMock = new Mock<ISomeInterface>();
        someInterfaceMock.Setup(x => x.AnotherMethod()).Verifiable();

        var caller = new Caller(someInterfaceMock.Object);

        // Act
        caller.Main();

        // Assert
        someInterfaceMock.Verify();
    }

এই পরীক্ষা চালানো তবে একটি ব্যতিক্রম উত্পন্ন করে ...

System.ArgumentException: Invalid setup on a non-member method:
x => x.AnotherMethod()

আমার প্রশ্ন হ'ল, মিক্সিন কলটি উপহাস করার কোনও দুর্দান্ত উপায় আছে কি?


3
আমার অভিজ্ঞতার সাথে, শব্দগুলি মেশিন এবং এক্সটেনশন পদ্ধতিগুলি পৃথক জিনিস।
মিক্সআপগুলি

উত্তর:


33

আপনি উপহাসের কাঠামোর সাথে মক স্ট্যাটিক পদ্ধতি (অতএব এক্সটেনশন পদ্ধতি) "সরাসরি" করতে পারবেন না। আপনি মোলস ( http://research.microsoft.com/en-us/projects/pex/downloads.aspx ) ব্যবহার করতে পারেন , মাইক্রোসফ্ট থেকে একটি নিখরচায় সরঞ্জাম যা ভিন্ন পদ্ধতির প্রয়োগ করে। এই সরঞ্জামটির বর্ণনা এখানে দেওয়া হয়েছে:

মোলগুলি পরীক্ষার স্টাবগুলি এবং .NET- র চার্চের জন্য একটি হালকা ফ্রেমওয়ার্ক যা প্রতিনিধিদের উপর ভিত্তি করে তৈরি হয়।

সিলযুক্ত ধরণের অ-ভার্চুয়াল / স্ট্যাটিক পদ্ধতি সহ কোনও NET পদ্ধতি ডিফলের জন্য মোল ব্যবহার করা যেতে পারে।

আপনি কোনও পরীক্ষার কাঠামো সহ মোলগুলি ব্যবহার করতে পারেন (এটি সম্পর্কে এটি স্বাধীন)।


2
মোলস ছাড়াও, অন্যান্য (অ-মুক্ত) মজাদার ফ্রেমওয়ার্ক রয়েছে যা মজাদার অবজেক্টগুলিতে .NET এর প্রোফাইলার এপিআই ব্যবহার করে এবং যাতে কোনও কল প্রতিস্থাপন করতে পারে। দুই আমি জানি হয় Telerik এর JustMock এবং TypeMock Isolator
মার্সেল গোসেলিন

6
তত্ত্বের ক্ষেত্রে মোলগুলি ভাল, তবে আমি যখন এটি পরীক্ষা করেছিলাম তখন এটি তিনটি সমস্যা পেয়েছিলাম যা এটি ব্যবহার বন্ধ করে দিয়েছিল ... 1) এটি পুনরায় ভাগ করে নেবে না নুনিটি রানার 2) প্রতিটি স্ট্যাবড সমাবেশ 3 এর জন্য আপনাকে ম্যানুয়ালি একটি তিল সমাবেশ তৈরি করতে হবে ) যখনই কোনও স্টাবযুক্ত পদ্ধতি পরিবর্তিত হয় আপনাকে ম্যানুয়ালি একটি তিল সমাবেশ পুনরায় তৈরি করতে হবে।
রাসেল গিডিংস

26

এই সমস্যাটি পেতে আমি একটি র‍্যাপার ব্যবহার করেছি। একটি মোড়কের বস্তু তৈরি করুন এবং আপনার উপহাস পদ্ধতিটি পাস করুন।

পল ইরউইনের দ্বারা ইউনিট পরীক্ষার জন্য মজাদার স্ট্যাটিক পদ্ধতিগুলি দেখুন , এর চমৎকার উদাহরণ রয়েছে।


12
আমি এই উত্তরটি পছন্দ করি কারণ এটি যা বলছে (সরাসরি এটি না বলে) আপনার পরীক্ষারযোগ্য করার জন্য আপনার কোডটি পরিবর্তন করা দরকার। এটি ঠিক কিভাবে এটি কাজ করে। মাইক্রোচিপ / আইসি / এএসআইসি ডিজাইনে বুঝতে হবে যে সেই চিপগুলি কেবল কাজ করার জন্যই নয়, আরও পরীক্ষামূলকভাবে আরও নকশাকৃত করতে হবে, কারণ আপনি যদি কোনও মাইক্রোচিপ পরীক্ষা করতে না পারেন তবে এটি অকেজো - আপনি গ্যারান্টি দিতে পারবেন না হবে। একই সফ্টওয়্যার জন্য যায়। যদি আপনি এটি পরীক্ষার জন্য তৈরি না করে থাকেন তবে এটি ... অকেজো। এটিকে পরীক্ষণযোগ্য হতে গড়ে তুলুন, যার কিছু ক্ষেত্রে কোড পুনর্লিখনের (এবং মোড়ক ব্যবহারের) অর্থ, এবং তারপরে এটি পরীক্ষিত স্বয়ংক্রিয় পরীক্ষাগুলি তৈরি করুন।
মাইকেল প্লুটজ

2
আমি একটি ছোট লাইব্রেরি তৈরি করেছি যা ড্যাপার, ডাপার.কন্ট্রিব এবং আইডিবি সংযোগটি মোড়ক করে। github.com/codeapologist/DataAbstrations.Dapper
ড্রু সুমিডো

15

আমি দেখতে পেলাম যে এক্সটেনশান পদ্ধতির আমি ইনপুটটির জন্য উপহাস করার চেষ্টা করেছি এবং এক্সটেনশনের অভ্যন্তরে কী চলছে তা উপহাস করার চেষ্টা করেছি।

আমি সরাসরি আপনার পদ্ধতিতে কোড যুক্ত করার জন্য একটি এক্সটেনশন ব্যবহার করে দেখেছি। এর অর্থ হ'ল আমাকে এক্সটেনশনের পরিবর্তে এক্সটেনশনের ভিতরে যা ঘটে তা বিদ্রূপ করা উচিত।


11

আপনি এমন একটি পরীক্ষা ইন্টারফেসকে উপহাস করতে পারেন যা আসলটি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং এক্সটেনশন পদ্ধতির মতো একই স্বাক্ষরের সদস্যও রয়েছে।

তারপরে আপনি পরীক্ষার ইন্টারফেসটিকে উপহাস করতে পারেন, মোককে আসলটি যুক্ত করতে পারেন এবং সেটআপে পরীক্ষার পদ্ধতিটি কল করতে পারেন।

আপনার মোক প্রয়োগের পরে আপনি যে পদ্ধতিটি চান তা কল করতে পারেন বা পদ্ধতিটি যে বলা হচ্ছে তা কেবল যাচাই করতে পারেন:

IReal //on which some extension method is defined
{
    ... SomeRegularMethod(...);
}

static ExtensionsForIReal
{
    static ... SomeExtensionMethod(this IReal iReal,...);
}

ITest: IReal
{
    //This is a regular method with same name and signature as the extension without the "this IReal iReal" parameter
    ... SomeExtensionMethod(...);
}

var someMock = new Mock<ITest>();
Mock.As<IReal>(); //ad IReal to the mock
someMock.Setup(x => x.SomeExtensionMethod(...)).Verifiable(); //Calls SomeExtensionMethod on ITest
someMock.As<IReal>().Setup(x => x.SomeRegularMethod(...)).Verifiable(); //Calls SomeRegularMethod on IReal

দুটি ইন্টারফেস সমর্থন করে এমন একটি মক কীভাবে প্রয়োগ করা যায় তার জন্য এই পোস্টে হাভার্ড এস সমাধানকে ধন্যবাদ । একবার আমি এটি খুঁজে পেয়েছি, এটি টেস্ট ইন্টারফেস এবং স্থির পদ্ধতিতে খাপ খাইয়ে নেওয়া ছিল একটি কেক ওয়াক।


আপনি আমাদের জন্য একই নমুনা স্বাক্ষর খুশি দেখাতে পারেন SomeNotAnExtensionMethodএবং SomeNotAnExtensionMethod? ইন্টারফেসের ভিতরে কীভাবে একটি এক্সটেনশন পদ্ধতির স্বাক্ষর তৈরি করব তা আমার এখন ধারণা ...
পিটার সিসালা

1
@ পিটার সিসালা: দুঃখিত যদি এটি অস্পষ্ট হয়। আমি পোস্টটি আরও স্পষ্ট করে আপডেট করার জন্য আপডেট করেছি এবং সামারনগনএক্সটেনশন মেথোডের নাম পরিবর্তন করে সামারগুলেমারথোড রেখেছি।
প্যাসেক্স

ক্ষেত্রে আপনি কীভাবে iRealপ্যারামিটারটি পাস করবেন ? আপনি যদি এটি প্রথম প্যারামিটার হিসাবে পাস করেন তবে আপনি কীভাবে সেটআপ করবেন? এটি একটি রানটাইম ব্যতিক্রম ঘটায়। SomeExtensionMethodITestSetup( x=> x.SomeExtensionMethod(x, ...)
পিটার Csala

আপনি এটি পাস করবেন না। মক আইটিস্টের দৃষ্টিকোণ থেকে আপনার কোডে সম্প্রসারণ পদ্ধতিতে কলগুলির স্বাক্ষরের সাথে মেলে এই পরামিতিটি ব্যতীত একটি নিয়মিত পদ্ধতি রয়েছে যাতে আপনি এখানে কোনও আইআরইল পাবেন না এবং কোনও ক্ষেত্রে আইআরইল / আইটিস্টের প্রয়োগটি মকই হ'ল । আপনি যদি সিক্স এক্সটেনশনমেডে বিদ্রূপিত আইরিলের কিছু বৈশিষ্ট্য অ্যাক্সেস করতে চান তবে মকের মধ্যে আপনার যা করা উচিত সবগুলি যেমন: object _mockCache = whatever... `সেটআপ (x => x.সোম এক্সটেনশনমিথড (...) .. কলব্যাক (() => আপনি করতে পারেন অ্যাক্সেস _মকক্যাচ এখানে)))
প্যাসেক্স

8

আপনি জাস্টমকের সাহায্যে সহজেই কোনও এক্সটেনশন পদ্ধতি উপহাস করতে পারেন । এপিআই হ'ল বিদ্রূপ করা সাধারণ পদ্ধতির মতো। নিম্নোক্ত বিবেচনা কর

public static string Echo(this Foo foo, string strValue) 
{ 
    return strValue; 
}

এই পদ্ধতিটি সাজানো ও যাচাই করতে নিম্নলিখিতগুলি ব্যবহার করুন:

string expected = "World";

var foo = new Foo();
Mock.Arrange(() => foo.Echo(Arg.IsAny<string>())).Returns(expected);

string result = foo.Echo("Hello");

Assert.AreEqual(expected, result);

এখানে ডকুমেন্টেশনের লিঙ্কটিও রয়েছে : এক্সটেনশন পদ্ধতিগুলি উপহাস করা


2

আমি যখন বস্তুটি নিজেই গুটিয়ে রাখি তখন আমি আবরণ (অ্যাডাপ্টারের প্যাটার্ন) ব্যবহার করতে চাই। আমি নিশ্চিত নই যে আমি এটি কোনও এক্সটেনশন পদ্ধতি মোড়ানোর জন্য ব্যবহার করেছি, যা বস্তুর অংশ নয়।

আমি উভয় প্রকারের ক্রিয়াকলাপ, ফানক, প্রেডিকেট বা ডেলিগেটের একটি অভ্যন্তরীণ অলস ইনজেকটেবল সম্পত্তি ব্যবহার করি এবং ইউনিট পরীক্ষার সময় পদ্ধতিটি ইনজেকশন (অদলবদল) করার অনুমতি দিই।

    internal Func<IMyObject, string, object> DoWorkMethod
    {
        [ExcludeFromCodeCoverage]
        get { return _DoWorkMethod ?? (_DoWorkMethod = (obj, val) => { return obj.DoWork(val); }); }
        set { _DoWorkMethod = value; }
    } private Func<IMyObject, string, object> _DoWorkMethod;

তারপরে আপনি আসল পদ্ধতির পরিবর্তে ফানকে কল করবেন।

    public object SomeFunction()
    {
        var val = "doesn't matter for this example";
        return DoWorkMethod.Invoke(MyObjectProperty, val);
    }

আরও সম্পূর্ণ উদাহরণের জন্য, দেখুন http://www.rhyous.com/2016/08/11/unit-testing-calls-to-complex-extension-methods/


এটি ভাল, তবে পাঠকদের সচেতন হওয়া উচিত যে _ডোকর্মথোড ক্লাসের একটি নতুন ক্ষেত্র যা এখন ক্লাসের প্রতিটি উদাহরণকে আরও একটি ক্ষেত্র বরাদ্দ করতে হবে। এটি গুরুত্বপূর্ণ যে এটি বিরল, তবে কখনও কখনও এটি আপনি যে কোনও এক সময় বরাদ্দ করছেন তার সংখ্যার উপর নির্ভর করে। আপনি এই সমস্যাটি নিয়ে কাজ করতে পারেন _ডোকর্কমথোড স্ট্যাটিক করে। এর নেতিবাচকতাটি হ'ল যদি আপনার ইউনিট পরীক্ষাগুলি একই সাথে চলমান থাকে, তবে দুটি একই ইউনিট পরীক্ষা একই স্ট্যাটিক মানকে সংশোধন করতে পারে।
zumalifeguard

-1

সুতরাং আপনি যদি মোক ব্যবহার করছেন এবং কোনও এক্সটেনশন পদ্ধতির ফলাফলকে উপহাস করতে চান তবে আপনি SetupReturnsDefault<ReturnTypeOfExtensionMethod>(new ConcreteInstanceToReturn())মক শ্রেণির উদাহরণটিতে ব্যবহার করতে পারেন যে সম্প্রসারণ পদ্ধতিটি আপনি উপহাস করার চেষ্টা করছেন।

এটি নিখুঁত নয়, তবে ইউনিট পরীক্ষার উদ্দেশ্যে এটি ভাল কাজ করে।


আমি বিশ্বাস করি এটির সেটটার্নস ডিফল্ট <T> ()
ডেভিড

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