मैं हाल ही में कुछ दोस्तों के साथ चर्चा कर रहा था कि निम्न में से कौन सी 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
करता है और कुछ भी वापस नहीं करता है।