মোক ব্যবহার করে একটি পদ্ধতি কল যাচাই করুন


142

আমি সি # তে ইউনিট পরীক্ষায় মোটামুটি নতুন এবং মোক ব্যবহার করতে শিখছি। নীচে ক্লাসটি যা আমি পরীক্ষার চেষ্টা করছি is

class MyClass
{
    SomeClass someClass;
    public MyClass(SomeClass someClass)
    {
        this.someClass = someClass;     
    }

    public void MyMethod(string method)
    {
        method = "test"
        someClass.DoSomething(method);
    }   
}

class Someclass
{
    public DoSomething(string method)
    {
        // do something...
    }
}

নীচে আমার টেস্টক্লাসটি রয়েছে:

class MyClassTest
{
    [TestMethod()]
    public void MyMethodTest()
    {
        string action="test";
        Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();
        mockSomeClass.SetUp(a => a.DoSomething(action));
        MyClass myClass = new MyClass(mockSomeClass.Object);
        myClass.MyMethod(action);
        mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>()));
    }
}

আমি নিম্নলিখিত ব্যতিক্রম পাই:

Expected invocation on the mock at least once, but was never performed
No setups configured.
No invocations performed..

আমি কেবল যাচাই করতে চাই যে পদ্ধতিটি "মাইমাথোড" বলা হচ্ছে কিনা। আমি কিছু অনুপস্থিত করছি?


1
এটির SomeClassসংজ্ঞা না থাকলে এটি সংকলন করবে না MyMethod(string), যা দেখে মনে হচ্ছে এটি এটি না।
প্ল্যাটিনাম আউজুরে

দুঃখিত..আমি আমার প্রশ্ন সম্পাদনা করেছি ..
ব্যবহারকারীর141510

1
আপনি সঠিক পথে রয়েছেন তবে পোস্ট কোডটিতে বাগ রয়েছে। এটি সংকলন করবে না - সোমক্লাসে কেসিং, ডসোমথিং-এ অকার্যকর রিটার্ন। এর পরে আপনার সর্বজনীন অ্যাক্সেস প্রয়োজন, তারপরে ডসোমিংটি ভার্চুয়াল করুন। সংক্ষেপে আপনার সম্ভবত সম্ভবত আপনার প্রোডাকশন কোডটিতেও একটি বাগ রয়েছে।
ট্রুউইল

আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ. মক পদ্ধতিটি সেট আপ করার সময় আমি যুক্তিগুলি ভুল করে
দিচ্ছিলাম

"কোনও সেটআপ কনফিগার করা নেই" " বিভ্রান্তিকর হতে পারে। যে পদ্ধতিগুলির জন্য ডাকা হবে তার জন্য আপনার কোনও আচরণ সেটআপ করার দরকার নেই। এবং মনে রাখবেন যে আপনি যা পরীক্ষা করছেন তার পরে "যাচাই করুন" পদ্ধতিটি কল করা উচিত (যাতে এটি আপনার ক্ষেত্রে ঠিক আছে)।
সিলু

উত্তর:


209

আপনি ভুল পদ্ধতি পরীক্ষা করছেন মোকের জন্য নির্ভরতা শ্রেণিতে আপনি পদ্ধতিটি সেটআপ (এবং তারপরে বৈকল্পিকভাবে যাচাই করা) দরকার।

আপনার আরও কিছু করা উচিত:

class MyClassTest
{
    [TestMethod]
    public void MyMethodTest()
    {
        string action = "test";
        Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();

        mockSomeClass.Setup(mock => mock.DoSomething());

        MyClass myClass = new MyClass(mockSomeClass.Object);
        myClass.MyMethod(action);

        // Explicitly verify each expectation...
        mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once());

        // ...or verify everything.
        // mockSomeClass.VerifyAll();
    }
}

অন্য কথায়, আপনি যে কলিংটি যাচাই করছেন MyClass#MyMethod, আপনার শ্রেণি অবশ্যই SomeClass#DoSomethingসেই প্রক্রিয়াতে একবার কল করবে । মনে রাখবেন আপনার Timesযুক্তির দরকার নেই ; আমি কেবল এর মান প্রদর্শন করছিলাম।


দুঃখিত, আমি আমার প্রশ্নটি সঠিক পদ্ধতিতে সম্পাদনা করেছি। যেমনটি আপনি উল্লেখ করেছেন, আমি প্রথমে সেটআপ চেষ্টা করেছি এবং তারপরে যাচাই করলাম। এটি এখনও আমাকে একই ব্যতিক্রম দেয়।
ব্যবহারকারী591410

22
কোনও প্রত্যাশা সেটআপ করা কি বেআইনী নয়, তারপরে স্পষ্টভাবে একই প্রত্যাশাটি যাচাই করবেন? mockSomeClass.VerifyAll();একই ফলাফল অর্জন করবে না এবং আরও শুকিয়ে যাবে?
টিম লং

14
হ্যাঁ এটি তবে কিছু লোকের সুস্পষ্ট হওয়ার পক্ষে।
প্ল্যাটিনাম আজুর

3
কমপক্ষে ভেরিফায়েল () উল্লেখ করার জন্য ধন্যবাদ; আপনি একবার এটি সম্পর্কে একবার চিন্তা যখন স্পষ্ট। আমি সুস্পষ্ট পদ্ধতির জন্য যেতে পারি, তবে সবগুলি ব্যবহার করার সময় অনেক ক্লিনার। ধন্যবাদ উভয় তালিকাভুক্ত করা হয়।
জগড

1
Mockতুলনার সাথে সম্পর্কিত একটি অসুবিধা NSubstituteহ'ল আপনি যদি প্যারামিটারগুলি যাচাই করার চেষ্টা করছেন এবং যাচাইকরণ ব্যর্থ হয় তবে এটি কেবল কী অনুরোধগুলি সম্পাদন করা হয়েছিল তা দেখায়, তবে আপনি যাচাইয়ের প্রকাশে ভেরিয়েবলগুলি ব্যবহার করেন তবে ঠিক কী প্রত্যাশা করা হয়েছিল তা প্রদর্শন করে না - এটি কেবল পরিবর্তনশীল প্রদর্শিত হবে নাম, এটির মান নয়, সুতরাং সেই ভেরিয়েবলের মানটি ঠিক কী তা পরীক্ষা করতে আপনাকে ডিবাগ করতে হবে। এন সাবস্টিটিউট কেবল উভয়ের মান দেখায় এবং যেখানে এটি আলাদা ছিল।
গ্রেঙ্গাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.