কোনও পদ্ধতিতে পাস করা মান ফিরিয়ে দেওয়া


390

একটি ইন্টারফেসে আমার একটি পদ্ধতি রয়েছে:

string DoSomething(string whatever);

আমি এমওকিউ দিয়ে এটি উপহাস করতে চাই, যাতে যা পাস হয়েছিল তা ফিরিয়ে দেয় - এরকম কিছু:

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;

কোন ধারনা?

উত্তর:


525

আপনি ইনপুট প্যারামিটার সহ ল্যাম্বদা ব্যবহার করতে পারেন, যেমন:

.Returns((string myval) => { return myval; });

বা কিছুটা বেশি পঠনযোগ্য:

.Returns<string>(x => x);

1
7 টি যুক্তিযুক্ত কোনও পদ্ধতির জন্য আপনার এটি করার প্রয়োজন না হওয়া পর্যন্ত একেবারে সহজ বলে মনে হচ্ছে ... যখন আমি IReturnsমোকে পরিদর্শন করি তখন এটি সর্বাধিক 4 টি আর্গুমেন্টেরReturns জন্য সংজ্ঞা দেয় । এর কাছাকাছি যাওয়ার কোনও সহজ উপায়? / আমি
মোকের উত্সটি

14
ঠিক আছে, এটা বজায় করার জন্য সংজ্ঞায়িত হচ্ছে 9 আর্গুমেন্ট মধ্যে Moqবনাম 4.0.0.0। সমাধান করা হয়েছে :)
মিজুকি নাকেশু

14
@ মিজুকিনাকেশু আমি 9 টি আর্গুমেন্ট পদ্ধতিতে কিছুটা রিফ্যাক্টর বিবেচনা করব কারণ শ্রেনী / পদ্ধতিটি খুব বেশি করছে বলে মনে হচ্ছে। সম্ভবত আপনাকে পুনরুদ্ধার করে একটি 9 টি পরামিতি একটি সেটিংস শ্রেণিতে বা স্ট্রাক্ট পরে আপনাকে সহায়তা করার জন্য?
সিনেটর

@ দ্য সিনেটর সম্মত হন, আমি এটি সম্পর্কে যা ইতিমধ্যে প্রতিক্রিয়া জানাই না তবে আমার ধারণা আমি ইতিমধ্যে বিদ্যমান কোডের জন্য একসাথে কিছু ইউনিট পরীক্ষা হ্যাক করছিলাম যা আমি সংশোধন করছিলাম না, অন্যথায় এই যুক্তিগুলি অবশ্যই রিফ্যাক্টরিংয়ের জন্য আহ্বান জানায়।
মিজুকি নকেশু

27
আমাকে বিভ্রান্ত করার মতো একটি নোট: স্ট্রিংটি .Returns<string>ইনপুট প্যারামিটারগুলি বোঝায় এবং আপনি যে মানগুলি ফিরিয়ে দিচ্ছেন তা নয়।
জিম

241

আরও কার্যকর, যদি আপনার একাধিক প্যারামিটার থাকে তবে আপনি যে কোনও একটি / সমস্তগুলিতে অ্যাক্সেস করতে পারবেন:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
     .Returns((string a, string b, string c) => string.Concat(a,b,c));

পদ্ধতির স্বাক্ষরের সাথে মেলে তুলতে আপনার সর্বদা সমস্ত যুক্তিগুলি উল্লেখ করতে হবে, এমনকি যদি আপনি কেবল তার মধ্যে একটি ব্যবহার করতে যাচ্ছেন use


17
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আপনার ঠিক এটি করা দরকার। অন্য যে কোনও কিছু "প্রত্যাশিত যুক্তির সংখ্যা" ব্যতিক্রম ছুঁড়ে দেয়।
চেইম এলিয়াহ

হ্যাঁ, অবশ্যই পড়ার পক্ষে সহজভাবে বরাদ্দ দেওয়া হয় এবং এটির ReturnsAsyncসাথেও কাজ করে!
পাইটর কুলা

1
এই উত্তরটি দিনটি বাঁচিয়েছিল। দ্রষ্টব্য (ভবিষ্যতের পাঠক), আপনি এটিকে আরও খানিকটা এগিয়ে নিতে পারেন। রিটার্নস ((স্ট্রিং এ, স্ট্রিং বি, স্ট্রিং সি) => {স্ট্রিং ডি = "ওয়াও"; রিটার্ন স্ট্রিং।কনক্যাট (এ, বি, সি, ডি);});
গ্রানাডা কোডার

1
ব্যক্তিগতভাবে, এটি আরও ভাল উত্তর is আমার মোক সম্পর্কে খুব কম জ্ঞান আছে তবে তবুও আমি তা অবিলম্বে বুঝতে পেরেছি।
unrealsoul007

অকার্যকর ফিরে আসার পদ্ধতির জন্য আমি ব্যবহার করেছি।
tymtam

62

জেনেরিক Returns<T>পদ্ধতি এই পরিস্থিতিটিকে সুন্দরভাবে পরিচালনা করতে পারে।

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);

অথবা যদি পদ্ধতির একাধিক ইনপুট প্রয়োজন হয় তবে সেগুলি তাদের মতো নির্দিষ্ট করুন:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.