মোক ব্যবহার করে দেখেছি Callback
কিন্তু কীভাবে এটি ব্যবহার করতে হয় তা বোঝার জন্য আমি একটি সাধারণ উদাহরণ খুঁজে পাইনি।
আপনার কাছে একটি ছোট কাজ করার স্নিপেট রয়েছে যা এটি কখন এবং কখন ব্যবহার করতে হবে তা স্পষ্টভাবে ব্যাখ্যা করে?
মোক ব্যবহার করে দেখেছি Callback
কিন্তু কীভাবে এটি ব্যবহার করতে হয় তা বোঝার জন্য আমি একটি সাধারণ উদাহরণ খুঁজে পাইনি।
আপনার কাছে একটি ছোট কাজ করার স্নিপেট রয়েছে যা এটি কখন এবং কখন ব্যবহার করতে হবে তা স্পষ্টভাবে ব্যাখ্যা করে?
উত্তর:
Https://github.com/Moq/moq4/wiki/Quickstart এ বীট করা শক্ত
যদি এটি যথেষ্ট পরিমাণে পরিষ্কার না হয় তবে আমি ডক বাগটি কল করব ...
সম্পাদনা: আপনার স্পষ্টির জবাবে ...
আপনার সম্পাদিত প্রতিটি উপহাসের পদ্ধতির Setup
জন্য, আপনি এই জাতীয় জিনিসগুলি নির্দেশ করতে পারবেন:
.Callback
প্রক্রিয়া বলে "আমি এখন এটি ব্যাখ্যা করতে পারবেন না, কিন্তু একটি কল ভালো আকৃতির ঘটে, আমাকে ফিরিয়ে কল এবং নিজের কৃতকর্মের করা প্রয়োজন করব"। একই অনর্গল কল চেইনের অংশ হিসাবে, আপনি .Returns
"এর মাধ্যমে ফলাফলটি (যদি থাকে তবে) নিয়ন্ত্রণ করতে পারেন । কিউএস উদাহরণগুলিতে, একটি উদাহরণ হ'ল তারা প্রতিবার ফেরত আসা মানকে বাড়িয়ে তোলে।
সাধারণভাবে, আপনার এ জাতীয় প্রায়শই প্রয়োজন হবে না (এক্স ইউনাইট টেস্ট প্যাটার্নসগুলিতে ইল্ক শর্তসাপেক্ষ লজিকের টেস্টের অ্যান্টিপ্যাটার্নগুলির জন্য শর্তাদি রয়েছে) এবং আপনার প্রয়োজনীয়তা স্থাপনের জন্য যদি কোনও সহজ বা অন্তর্নির্মিত উপায় থাকে তবে তা হওয়া উচিত পছন্দ হিসাবে ব্যবহৃত।
জাস্টিন ইথেরেজের মক সিরিজের 4 অংশের 3 টি এটি কভার করে, এবং এখানে কলব্যাকের আরও একটি উদাহরণ রয়েছে
কলব্যাকের একটি সহজ উদাহরণ মক পোস্টের সাথে কলব্যাকগুলি ব্যবহার করে পাওয়া যাবে ।
Callback
রিটার্ন মানটির সাথে কোনও সম্পর্ক নেই (যদি আপনি কোডের মাধ্যমে এটি সংযুক্ত না করেন)। মূলত এটি কেবল নিশ্চিত করে যে প্রতিটি আহ্বানের আগে বা পরে কলব্যাক বলা হয়েছিল (আপনি Returns
যথাক্রমে আগে বা পরে এটি বেঁধে ছিলেন কিনা তার উপর নির্ভর করে ), সরল এবং সাধারণ।
একটি ডেটা পরিষেবাতে প্রেরিত কোনও সত্তা যা একটি সন্নিবেশ পরিচালনা করে তা পরীক্ষা করার জন্য কলব্যাক ব্যবহার করার উদাহরণ এখানে।
var mock = new Mock<IDataService>();
DataEntity insertedEntity = null;
mock.Setup(x => x.Insert(It.IsAny<DataEntity>())).Returns(1)
.Callback((DataEntity de) => insertedEntity = de);
বিকল্প জেনেরিক পদ্ধতি বাক্য গঠন:
mock.Setup(x => x.Insert(It.IsAny<DataEntity>())).Returns(1)
.Callback<DataEntity>(de => insertedEntity = de);
তারপরে আপনি এরকম কিছু পরীক্ষা করতে পারেন
Assert.AreEqual("test", insertedEntity.Description, "Wrong Description");
It.Is<T>
একটি Mock.Verify
তেম্প্স সঙ্গে পরীক্ষা যত্র তত্র আবর্জনা ফেলার পরিবর্তে। তবে +1 কারণ আমি বাজি ধরেছি যে প্রচুর লোক রয়েছে যা উদাহরণ থেকে সবচেয়ে ভাল কাজ করবে।
Callback
মোকে দুই ধরণের রয়েছে । কলটি ফিরে আসার আগেই ঘটে; কলটি রিটার্ন হওয়ার পরে অন্যটি ঘটে।
var message = "";
mock.Setup(foo => foo.Execute(arg1: "ping", arg2: "pong"))
.Callback((x, y) =>
{
message = "Rally on!";
Console.WriteLine($"args before returns {x} {y}");
})
.Returns(message) // Rally on!
.Callback((x, y) =>
{
message = "Rally over!";
Console.WriteLine("arg after returns {x} {y}");
});
উভয় কলব্যাকগুলিতে, আমরা এটি করতে পারি:
Callback
মক এর কোনও পদ্ধতিতে কল করা হলে আপনি যে কোনও কাস্টম কোড চান তা কার্যকর করার একটি উপায় to এখানে একটি সাধারণ উদাহরণ:
public interface IFoo
{
int Bar(bool b);
}
var mock = new Mock<IFoo>();
mock.Setup(mc => mc.Bar(It.IsAny<bool>()))
.Callback<bool>(b => Console.WriteLine("Bar called with: " + b))
.Returns(42);
var ret = mock.Object.Bar(true);
Console.WriteLine("Result: " + ret);
// output:
// Bar called with: True
// Result: 42
আমি সম্প্রতি এটির জন্য একটি আকর্ষণীয় ব্যবহারের ক্ষেত্রে ছুঁড়েছি। মনে করুন আপনি আপনার উপহাসের জন্য কিছু কল আশা করেছেন তবে সেগুলি একই সাথে ঘটে। সুতরাং তারা যে আদেশে কল করত তা জানার কোনও উপায় নেই তবে আপনি যে কলগুলি প্রত্যাশা করেছিলেন সেগুলি (অর্ডার নির্বিশেষে) সংঘটিত হয়েছিল তা জানতে চান। আপনি এর মতো কিছু করতে পারেন:
var cq = new ConcurrentQueue<bool>();
mock.Setup(f => f.Bar(It.IsAny<bool>())).Callback<bool>(cq.Enqueue);
Parallel.Invoke(() => mock.Object.Bar(true), () => mock.Object.Bar(false));
Console.WriteLine("Invocations: " + String.Join(", ", cq));
// output:
// Invocations: True, False
বিটিডব্লিউ "আগে Returns
" এবং "পরে Returns
" পার্থক্য বিভ্রান্তিকর দ্বারা বিভ্রান্ত করবেন না । আপনার কাস্টম কোডটি Returns
মূল্যায়ন করার পরে বা তার আগে চলবে কিনা এটি কেবল প্রযুক্তিগত পার্থক্য । কলারের দৃষ্টিতে, মানটি ফেরতের আগে দু'জনেই চলবে। প্রকৃতপক্ষে, যদি পদ্ধতিটি void
পুনরুদ্ধার হয় তবে আপনি কল করতে পারবেন না Returns
এবং এখনও এটি একই কাজ করে। আরও তথ্যের জন্য https://stackoverflow.com/a/28727099/67824 দেখুন ।
এখানে অন্যান্য ভাল উত্তরের উপরে, আমি একটি ব্যতিক্রম ছোঁড়ার আগে যুক্তি সম্পাদন করতে এটি ব্যবহার করেছি। উদাহরণস্বরূপ, আমাকে পরে যাচাইকরণের জন্য কোনও পদ্ধতিতে পাস করা সমস্ত বস্তু সংরক্ষণ করতে হবে এবং সেই পদ্ধতিটি (কিছু পরীক্ষার ক্ষেত্রে) একটি ব্যতিক্রম ছুঁড়ে ফেলার দরকার ছিল। কল .Throws(...)
করা ক্রিয়াকে Mock.Setup(...)
ওভাররাইড করে Callback()
এবং কখনই কল করে না। যাইহোক, কলব্যাকের মধ্যে একটি ব্যতিক্রম ছুঁড়ে ফেলে দিয়ে, আপনি কলব্যাকের যে সমস্ত ভাল জিনিস কলব্যাক অফার করতে হবে তার সবকটি করতে পারেন এবং এখনও একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন।