আমি মোকে কীভাবে কোনও টাস্ক ফিরিয়ে দিতে বলতে পারি?


327

আমি একটি ইন্টারফেস পেয়েছি যা ঘোষণা করে

Task DoSomethingAsync();

আমি আমার পরীক্ষার জন্য ম্যাকফ্রেমওয়ার্ক ব্যবহার করছি:

[TestMethod()]
public async Task MyAsyncTest()
{
   Mock<ISomeInterface> mock = new Mock<ISomeInterface>();
   mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> });
   ...
}

তারপরে আমার পরীক্ষায় আমি কোডটি চালিত করি যা অনুরোধ করে await DoSomethingAsync()। এবং পরীক্ষা কেবল সেই লাইনে ব্যর্থ হয়। আমি কি ভুল করছি?


5
আপনি যখন সেই লাইনে পরীক্ষার ত্রুটিগুলি বলছেন, তখন এটি কোন ত্রুটি সৃষ্টি করে?
— আলস্কি

@ আলস্কি প্রস্তাবিতভাবে নুলারফেরান এক্সেকশন। যেমন আপনি এখানে
— লাকিলিকি

উত্তর:


709

আপনার পদ্ধতিতে কোনও কলব্যাক নেই তাই ব্যবহারের কোনও কারণ নেই .CallBack()। আপনি কেবল ব্যবহার পছন্দসই মান একটি টাস্ক আসতে পারেন .Returns()এবং Task.FromResult , যেমন:

MyType someValue=...;
mock.Setup(arg=>arg.DoSomethingAsync())        
    .Returns(Task.FromResult(someValue));

আপডেট 2014-06-22

Moq 4.2 এর সাথে সহায়তা করার জন্য দুটি নতুন এক্সটেনশন পদ্ধতি রয়েছে।

mock.Setup(arg=>arg.DoSomethingAsync())
    .ReturnsAsync(someValue);

mock.Setup(arg=>arg.DoSomethingAsync())        
    .ThrowsAsync(new InvalidOperationException());

আপডেট 2016-05-05

শেঠ ফুল উল্লেখ করেছে হিসাবে অন্যান্য উত্তর , ReturnsAsyncপদ্ধতি একটি ফিরতি জন্য কেবল প্রাপ্তিসাধ্য Task<T>। যে পদ্ধতিগুলিতে কেবল একটি কার্য ফিরে আসে,

.Returns(Task.FromResult(default(object)))

ব্যবহার করা যেতে পারে.

এই উত্তরে যেমন দেখানো হয়েছে , নেট নেট 6.6 এ এটিকে সহজ করা হয়েছে .Returns(Task.CompletedTask);, যেমন:

mock.Setup(arg=>arg.DoSomethingAsync())        
    .Returns(Task.CompletedTask);

16
.Returns (Task.CompletedTask); আমার উত্তর ছিল
— টড ভ্যানস

8
এই উত্তরটি আপ-টু-ডেট রাখার জন্য ধন্যবাদ যেমন মোখ ফ্রেমওয়ার্কটি আপডেট পেয়েছে!
— জ্যাকব স্ট্যাম 18

.Returns(Task.FromResult(default(object))রিটার্নের টাইপটি বাতিল হলে ভাল কাজ করে। .Returns(Task.FromResult(null as MyType))প্রত্যাশিত রিটার্নের ধরনটি বাতিল হলে ভাল কাজ করে।
— জেরেমি রে ব্রাউন

1
@ জেরেমিরেব্রাউন যেমনটি আমি বর্ণনা করেছি, নেট 4..6-এ default(object)আর দরকার নেই। একটি রেফারেন্স টাইপ হিসাবে দীর্ঘ হিসাবে null as MyTypeএকই । default(MyType)MyType
— পানাজিওটিস কানভোস

40

অনুরূপ ইস্যু

আমার কাছে একটি ইন্টারফেস রয়েছে যা দেখতে মোটামুটি দেখাচ্ছে:

Task DoSomething(int arg);

লক্ষণ

আমার ইউনিট পরীক্ষাটি যখন পরীক্ষার অধীনে আমার পরিষেবাটি ব্যর্থ হয়েছিল awaited কল করারDoSomething ।

ফিক্স

গৃহীত উত্তরের মতো নয়, আপনি এই দৃশ্যে .ReturnsAsync()আপনার Setup()এই পদ্ধতিটির বিষয়ে কল করতে অক্ষম , কারণ পদ্ধতিটি Taskবরং জেনারিককে ফিরিয়ে দেয় Task<T>।

যাইহোক, আপনি .Returns(Task.FromResult(default(object)))পরীক্ষাটি পাসের অনুমতি দিয়ে এখনও সেটআপটিতে ব্যবহার করতে সক্ষম ।


1
এ সম্পর্কে কেবল একটি চিন্তাভাবনা, যদি আপনাকে কোনও জেনেরিক টাস্ক (নন। নেট 4.6) ফিরিয়ে দিতে হয় তবে আমি টাস্ককে ফিরিয়ে আনার বিষয়টি বিবেচনা করব e ডেলা (1) একটি টাস্ক ফেরত দেওয়ার সহজ উপায়। সময়ের যুক্তি বাড়িয়ে আপনিও কাজের নকল করতে পারেন।
— স্টিভিথথ্রেড

26

আপনাকে কেবল .Returns(Task.FromResult(0));কলব্যাকের পরে যুক্ত করা দরকার ।

উদাহরণ:

mock.Setup(arg => arg.DoSomethingAsync())
    .Callback(() => { <my code here> })
    .Returns(Task.FromResult(0));

4

এখন আপনি ট্যালেন্টসফট.মোক.সেটআপএেন্স প্যাকেজটিও ব্যবহার করতে পারেন https://github.com/TalentSoft/Moq.SetupAsync

যা এখানে পাওয়া উত্তরের ভিত্তিতে এবং মকের কাছে প্রস্তাবিত ধারণাগুলির ভিত্তিতে রয়েছে তবে এখনও এটি এখানে প্রয়োগ করা হয়নি: https://github.com/moq/moq4/issues/384 , অ্যাসিঙ্ক পদ্ধতির সেটআপটিকে খুব সহজ করে তোলে

সেটআপএন্সিঙ্ক এক্সটেনশনের সাহায্যে পূর্ববর্তী প্রতিক্রিয়াগুলিতে কয়েকটি উদাহরণ পাওয়া গেছে:

mock.SetupAsync(arg=>arg.DoSomethingAsync());
mock.SetupAsync(arg=>arg.DoSomethingAsync()).Callback(() => { <my code here> });
mock.SetupAsync(arg=>arg.DoSomethingAsync()).Throws(new InvalidOperationException());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.