เมื่อเร็ว ๆ นี้ฉันได้พูดคุยกับเพื่อนบางคนซึ่งวิธีการ 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 ยังสามารถเป็นสาธารณะ
FunctionB
ถูกทำลายโดยการออกแบบ new Random().Next()
ผิดเกือบทุกครั้ง Random
คุณควรฉีดตัวอย่างของ ( Random
เป็นคลาสที่ออกแบบมาไม่ดีซึ่งอาจทำให้เกิดปัญหาเพิ่มเติมเล็กน้อย)
FunctionA
ส่งกลับค่าบูล แต่ตั้งค่าตัวแปรเฉพาะที่x
และไม่ส่งคืนสิ่งใด