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


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.