আমি সম্প্রতি কিছু বন্ধুদের সাথে আলোচনা করছিলাম নীচের 2 টি পদ্ধতির মধ্যে কোনটি একই শ্রেণীর অভ্যন্তরীণ পদ্ধতিগুলি থেকে একই শ্রেণীর অভ্যন্তরীণ পদ্ধতিগুলিতে ফিরতি ফলাফল বা কলগুলার পক্ষে সবচেয়ে ভাল।
এটি একটি খুব সরল উদাহরণ। বাস্তবে ফাংশনগুলি আরও জটিল।
উদাহরণ:
public class MyClass
{
public bool FunctionA()
{
return FunctionB() % 2 == 0;
}
protected int FunctionB()
{
return new Random().Next();
}
}
সুতরাং এটি পরীক্ষা করার জন্য আমাদের কাছে 2 টি পদ্ধতি রয়েছে।
পদ্ধতি 1: পদ্ধতিগুলির কার্যকারিতা প্রতিস্থাপন করতে কার্য এবং ক্রিয়াগুলি ব্যবহার করুন। উদাহরণ:
public class MyClass
{
public Func<int> FunctionB { get; set; }
public MyClass()
{
FunctionB = FunctionBImpl;
}
public bool FunctionA()
{
return FunctionB() % 2 == 0;
}
protected int FunctionBImpl()
{
return new Random().Next();
}
}
[TestClass]
public class MyClassTests
{
private MyClass _subject;
[TestInitialize]
public void Initialize()
{
_subject = new MyClass();
}
[TestMethod]
public void FunctionA_WhenNumberIsOdd_ReturnsTrue()
{
_subject.FunctionB = () => 1;
var result = _subject.FunctionA();
Assert.IsFalse(result);
}
}
পদ্ধতি 2: সদস্যগুলিকে ভার্চুয়াল তৈরি করুন, শ্রেণিভুক্ত করা এবং উত্পন্ন শ্রেণিতে কার্যকারিতা প্রতিস্থাপনের জন্য কার্য এবং ক্রিয়াগুলি উদাহরণ করুন:
public class MyClass
{
public bool FunctionA()
{
return FunctionB() % 2 == 0;
}
protected virtual int FunctionB()
{
return new Random().Next();
}
}
public class TestableMyClass
{
public Func<int> FunctionBFunc { get; set; }
public MyClass()
{
FunctionBFunc = base.FunctionB;
}
protected override int FunctionB()
{
return FunctionBFunc();
}
}
[TestClass]
public class MyClassTests
{
private TestableMyClass _subject;
[TestInitialize]
public void Initialize()
{
_subject = new TestableMyClass();
}
[TestMethod]
public void FunctionA_WhenNumberIsOdd_ReturnsTrue()
{
_subject.FunctionBFunc = () => 1;
var result = _subject.FunctionA();
Assert.IsFalse(result);
}
}
আমি জানতে চাই যে আরও ভাল এবং কেন?
আপডেট: দ্রষ্টব্য: ফাংশনবিও সর্বজনীন হতে পারে
FunctionB
নকশা ভাঙ্গা। new Random().Next()
প্রায় সর্বদা ভুল। আপনার উদাহরণটি ইনজেক্ট করা উচিত Random
। ( Random
এটি একটি খারাপভাবে ডিজাইন করা
FunctionA
একটি বিল ফেরত দেয় তবে কেবল একটি স্থানীয় ভেরিয়েবল সেটx
করে এবং কোনও কিছুই ফেরত দেয় না।