মোকের সাথে একবারে কোনও পদ্ধতির ডাক দেওয়া হয়েছিল আমি কীভাবে যাচাই করব?


111

মোকের সাথে একবারে কোনও পদ্ধতির ডাক দেওয়া হয়েছিল আমি কীভাবে যাচাই করব? Verify()বনাম Verifable()জিনিস সত্যিই বিভ্রান্তিকর।

উত্তর:


164

আপনি ব্যবহার করতে পারেন Times.Once(), বা Times.Exactly(1):

mockContext.Verify(x => x.SaveChanges(), Times.Once());
mockContext.Verify(x => x.SaveChanges(), Times.Exactly(1));

টাইমস ক্লাসে পদ্ধতিগুলি এখানে :

  • AtLeast - নির্দিষ্ট করে যে কোনও উপহাস পদ্ধতিটি সর্বনিম্ন হিসাবে বার বার চাওয়া উচিত।
  • AtLeastOnce - নির্দিষ্ট করে যে কোনও উপহাস পদ্ধতিতে ন্যূনতম হিসাবে একবারে আবেদন করা উচিত।
  • AtMost - সুনির্দিষ্টভাবে উল্লেখ করা হয়েছে যে একটি উপহাস পদ্ধতিটি সর্বোচ্চ সময় হিসাবে প্রার্থনা করা উচিত।
  • AtMostOnce - সুনির্দিষ্টভাবে উল্লেখ করা হয়েছে যে একটি উপহাস পদ্ধতিতে সর্বোচ্চ একবারে প্রার্থনা করা উচিত।
  • Between - নির্দিষ্ট করে যে কোনও উপহাস পদ্ধতিটি সময়ে এবং সময়ে সময়ে শুরু করা উচিত।
  • Exactly - নির্দিষ্ট করে যে একটি উপহাস পদ্ধতিটি ঠিক সময়ে বার করা উচিত।
  • Never - নির্দিষ্ট করে যে কোনও উপহাস পদ্ধতিটি চালু করা উচিত নয়।
  • Once - সুনির্দিষ্টভাবে উল্লেখ করা হয়েছে যে একটি উপহাস পদ্ধতিটি ঠিক একবারে চালু করা উচিত।

কেবল মনে রাখবেন যে তারা পদ্ধতি কল; আমি তাদের বিচ্ছিন্ন হতে থাকি, তারা সম্পত্তি হিসাবে ভেবে এবং প্রথম বন্ধনী ভুলে গিয়েছিলাম।


2
তাহলে আপনি কীভাবে মক কনটেক্সট সেটআপ করবেন / পাবেন?
চকো

2
@ চোকো আমি ধরে নিলাম যে এটি তার মক উদাহরণ মাত্র। সুতরাং এটি var mockContext = new Mock<IContext>()সেট আপ করার মত কিছু ছিল ।
জ্যাক হুবার

আমি শুধু ভাবছি AtLeast, AtMost, Between, অথবা Exactlyসম্পত্তি হিসেবে দেখা যেতে পারে। আমি বলতে চাইছি তাদের কিছু করার জন্য ওগুলির একটি প্যারামিটার প্রয়োজন।
ড্যানিয়েলো ইয়েলিজারভ

8

কল্পনা করুন যে আমরা 2 টি সংখ্যার যোগ করার জন্য একটি পদ্ধতি দিয়ে একটি ক্যালকুলেটর তৈরি করছি। আসুন আরও কল্পনা করা যাক প্রয়োজনটি হ'ল যখন অ্যাড পদ্ধতিটি কল করা হয়, এটি একবার মুদ্রণ পদ্ধতিটিকে কল করে। এখানে আমরা এটি পরীক্ষা করব:

public interface IPrinter
{
    void Print(int answer);
}

public class ConsolePrinter : IPrinter
{
    public void Print(int answer)
    {
        Console.WriteLine("The answer is {0}.", answer);
    }
}

public class Calculator
{
    private IPrinter printer;
    public Calculator(IPrinter printer)
    {
        this.printer = printer;
    }

    public void Add(int num1, int num2)
    {
        printer.Print(num1 + num2);
    }
}

এবং এখানে আরও স্পষ্টতার জন্য কোডের মধ্যে মন্তব্যে আসল পরীক্ষাটি দেওয়া হয়েছে:

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    public void WhenAddIsCalled__ItShouldCallPrint()
    {
        /* Arrange */
        var iPrinterMock = new Mock<IPrinter>();

        // Let's mock the method so when it is called, we handle it
        iPrinterMock.Setup(x => x.Print(It.IsAny<int>()));

        // Create the calculator and pass the mocked printer to it
        var calculator = new Calculator(iPrinterMock.Object);

        /* Act */
        calculator.Add(1, 1);

        /* Assert */
        // Let's make sure that the calculator's Add method called printer.Print. Here we are making sure it is called once but this is optional
        iPrinterMock.Verify(x => x.Print(It.IsAny<int>()), Times.Once);

        // Or we can be more specific and ensure that Print was called with the correct parameter.
        iPrinterMock.Verify(x => x.Print(3), Times.Once);
    }
}

দ্রষ্টব্য : ডিফল্টরূপে মক আপনি একটি মক অবজেক্ট তৈরি করার সাথে সাথে সমস্ত বৈশিষ্ট্য এবং পদ্ধতিগুলি স্তম্ভিত করে দেবেন। এমনকি কল না করেও Setup, মোক ইতিমধ্যে পদ্ধতিগুলির জন্য ঝাঁকুনি ফেলেছে IPrinterযাতে আপনি কেবল কল করতে পারেন Verify। তবে, একটি ভাল অনুশীলন হিসাবে, আমি সর্বদা এটি সেট আপ করেছি কারণ নির্দিষ্ট প্রত্যাশা পূরণের জন্য আমাদের পদ্ধতির পরামিতিগুলি প্রয়োগ করতে হবে, অথবা নির্দিষ্ট প্রত্যাশা পূরণের জন্য পদ্ধতি থেকে প্রত্যাবর্তনের মান বা এটির নাম্বারটি কতবার বলা হয়েছিল।


আমি ফোন করছিলাম Verify, Times.Onceকখনও কল না করে Setup। আমি অবশ্যই Verifyএই ক্ষেত্রে গাট্টা হবে আশা করব , কিন্তু তা হয়নি।
dudeNumber4

@ dudeNumber4 না এটি ফুঁকবে না কারণ ডিফল্টরূপে মূক আপনি কোনও Mockবস্তু তৈরি করার সাথে সাথে সমস্ত বৈশিষ্ট্য এবং পদ্ধতিগুলিকে স্ট্যাব করে দেবেন । এমনকি কল না করেও Setup, মোক ইতিমধ্যে পদ্ধতিগুলির জন্য ঝাঁকুনি ফেলেছে IPrinterযাতে আপনি কেবল কল করতে পারেন Verify। তবে, একটি ভাল অনুশীলন হিসাবে, আমি সর্বদা এটি সেট আপ করি কারণ আমাদের পদ্ধতিতে প্যারামিটারগুলি প্রয়োগ করতে বা পদ্ধতি থেকে ফেরতের মান প্রয়োগ করতে হতে পারে।
কোডিংইয়োশি

দুঃখিত, এটি একটি ভয়ানক ব্যাখ্যা ছিল। আমি ফোন করেছি Times.Exactly(1)এবং যখন পদ্ধতিটি আসলে দুটিবার বলা হয়েছিল তখন এটি ব্যর্থ হয় নিSetupপ্রশ্নে পদ্ধতিটি যুক্ত করার পরে এটি সঠিকভাবে ব্যর্থ হয়েছিল।
dudeNumber4

2

পরীক্ষা নিয়ামক হতে পারে:

  public HttpResponseMessage DeleteCars(HttpRequestMessage request, int id)
    {
        Car item = _service.Get(id);
        if (item == null)
        {
            return request.CreateResponse(HttpStatusCode.NotFound);
        }

        _service.Remove(id);
        return request.CreateResponse(HttpStatusCode.OK);
    }

এবং যখন ডিলিটকার্স পদ্ধতিটি বৈধ আইডি সহ কল ​​করা হয়, তখন আমরা তা যাচাই করতে পারি, পরিষেবা অপসারণ পদ্ধতিটি এই পরীক্ষার মাধ্যমে ঠিক একবার বলা হয়:

 [TestMethod]
    public void Delete_WhenInvokedWithValidId_ShouldBeCalledRevomeOnce()
    {
        //arange
        const int carid = 10;
        var car = new Car() { Id = carid, Year = 2001, Model = "TTT", Make = "CAR 1", Price=2000 };
        mockCarService.Setup(x => x.Get(It.IsAny<int>())).Returns(car);

        var httpRequestMessage = new HttpRequestMessage();
        httpRequestMessage.Properties[HttpPropertyKeys.HttpConfigurationKey] = new HttpConfiguration();

        //act
        var result = carController.DeleteCar(httpRequestMessage, vechileId);

        //assert
        mockCarService.Verify(x => x.Remove(carid), Times.Exactly(1));
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.