Gần đây tôi đã thảo luận với một số người bạn về hai phương pháp sau đây là tốt nhất để loại bỏ kết quả trả về hoặc gọi đến các phương thức trong cùng một lớp từ các phương thức trong cùng một lớp.
Đây là một ví dụ rất đơn giản. Trong thực tế các chức năng phức tạp hơn nhiều.
Thí dụ:
public class MyClass
{
public bool FunctionA()
{
return FunctionB() % 2 == 0;
}
protected int FunctionB()
{
return new Random().Next();
}
}
Vì vậy, để kiểm tra điều này, chúng tôi có 2 phương pháp.
Phương pháp 1: Sử dụng Hàm và Hành động để thay thế chức năng của các phương thức. Thí dụ:
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);
}
}
Phương pháp 2: Làm cho các thành viên ảo, lớp dẫn xuất và trong lớp dẫn xuất sử dụng Hàm và hành động để thay thế chức năng Ví dụ:
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);
}
}
Tôi muốn biết wich là tốt hơn và TẠI SAO?
Cập nhật: LƯU Ý: FunctionB cũng có thể được công khai
FunctionB
được thiết kế phá vỡ. new Random().Next()
hầu như luôn luôn sai. Bạn nên tiêm ví dụ Random
. ( Random
cũng là một lớp được thiết kế tồi, có thể gây ra một vài vấn đề khác)
FunctionA
trả về một bool nhưng chỉ đặt một biến cục bộx
và không trả về bất cứ thứ gì.