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


466

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

এটিতে AssertWasNotCalled এর মতো কিছু আছে কি?

আপডেট: সংস্করণ 3.0 থেকে শুরু করে একটি নতুন সিনট্যাক্স ব্যবহার করা যেতে পারে:

mock.Verify(foo => foo.Execute("ping"), Times.Never());

উত্তর:


155

আপডেট : সংস্করণ 3 থেকে, উপরের প্রশ্নটির আপডেটটি বা ড্যানের উত্তর নীচে দেখুন।

হয়, আপনার উপহাসকে কঠোর করুন তাই যদি আপনি এমন কোনও পদ্ধতি কল করেন যার জন্য আপনার কোনও প্রত্যাশা নেই

new Mock<IMoq>(MockBehavior.Strict)

অথবা, আপনি যদি নিজের উপহাসটি আলগা করতে চান তবে .আর ব্যবহার করুন (ব্যতিক্রম)

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

9
... বা কিছুটা পতাকা সেট করতে কলব্যাক ())
অ্যালেক্স

2
বিকল্প # 2 এর সাথেও, আপনার সাধারণ টিয়ারডাউন পদ্ধতিতে ভেরিফিল থাকতে পারে না - এটি প্রত্যাশা পূরণ হয়নি তা বলে ব্যর্থ হবে; যখন পরীক্ষাটি আদর্শভাবে পাস করা উচিত।
গিশু

51
এটি সত্যিকার অর্থে কোনও "যাচাই করা হয়নি" নয় কারণ এটি পদ্ধতির মধ্যে ধরা পড়ে এবং এখনও কাজ করে - একটি মিথ্যা ইতিবাচক সরবরাহ করে!
ড্যান

4
প্রত্যাশাটি এখন
অবচয় করা

5
এটি সম্ভবত ২০০৯ সালের সেরাতম উপায় হতে পারে তবে এখনই তা নয়। দুঃখিত
Fabio মিলহিরো

537

পরীক্ষার পরে একটি Times.Neverএনাম সেট রয়েছে যাচাই করে নিন Run যেমন

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());

4
এখানে যেটি গুরুত্বপূর্ণ তা হল ভেরিফাইয়ের (ক্রিয়াকলাপ, কখনই নয়) কলটি মকের কাছে প্রার্থনার পরে । আমি ভেবেছিলাম এটা VerifyAll (কলিং) পরবর্তী সময়ের জন্য যাচাইকরণ অস্ত যাবার সময় (যা করে না কর্মস্থল)
piers7

সহজ এবং কার্যকর। ধন্যবাদ।
ইয়ান গ্রেঞ্জার

45

চুরি করা থেকে: জন ফস্টার এর প্রশ্নের উত্তর, "মাককে আরও ভালভাবে বুঝতে সাহায্যের প্রয়োজন"

আপনি যা পরীক্ষা করতে চাইতে পারেন তার মধ্যে একটি হ'ল 65 বছরের বেশি বয়সী কোনও ব্যক্তি যখন পদ্ধতিতে পাস হয় তখন বেতন পদ্ধতিটি কল করা হয় না

[Test]
public void Someone_over_65_does_not_pay_a_pension_contribution() {

    var mockPensionService = new Mock<IPensionService>();

    var person = new Person("test", 66);

    var calc = new PensionCalculator(mockPensionService.Object);

    calc.PayPensionContribution(person);

    mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never());
}

10

এটি মোকের সাম্প্রতিক সংস্করণগুলিতে কাজ করে না (কমপক্ষে ৩.১ থেকে), Verifyউত্তরে উল্লিখিত পদ্ধতিতে এটি নির্দিষ্ট করা উচিত ।

আসলে, .AtMost(0)রিটার্নস স্টেটমেন্টের পরে নির্দিষ্ট করা আরও ভাল better

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

যদিও "নিক্ষেপ" কাজ করে, AtMost(0)ততই ভাব প্রকাশ করে IM


-5

.আটমস্টঅনস () ব্যবহার করুন;

আসল পরীক্ষার পরে, পদ্ধতিটি আবার কল করুন। যদি এটি ব্যতিক্রম ছুঁড়ে, এটি ডাকা হত।


1
এই ব্যতিক্রমটিকে ঠাট্টা-বিদ্রূপের কাঠামোর দ্বারা ছুঁড়ে ফেলে দেওয়া কি দৃ a়রূপে বলা যায় না?
অ্যালেক্স

কেন? কেবল ব্যতিক্রমের ধরণটি পরীক্ষা করে দেখুন। যদি এটি আমার মাককে ফেলে দেয় তবে আপনি নিরাপদ হন।
অ্যারন দিগুল্লা

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