Giả sử tôi có một thói quen tư nhân thực hiện một số tính toán:Làm thế nào để kiểm tra đơn vị mã riêng mà không cần tái cấu trúc để phân lớp?
private function TCar.Speed: float
{
Result = m_furlogs * 23;
}
Nhưng bây giờ tôi muốn bắt đầu thử nghiệm tính toán này triệt để hơn, vì vậy tôi refactor nó ra một chức năng riêng biệt:
public function TCar.Speed: float
{
Result = CalculateSpeed(m_furlogs);
}
private function TCar.CalculateSpeed(single furlogs): float
{
Result = furlogs * 23;
}
Bây giờ tôi có thể thực hiện tất cả các loại thử nghiệm trên CalculateSpeed
:
Check(CalculateSpeed(0) = 0);
Check(CalculateSpeed(1) = 23);
Check(CalculateSpeed(2) = 46);
Check(CalculateSpeed(88) = -1);
Ngoại trừ việc tôi không thể thực hiện các thử nghiệm này, vì CalculateSpeed
là riêng tư để TCar
. Một tennant trừu tượng của kiểm thử đơn vị là bạn không bao giờ thử nghiệm mã riêng - chỉ các giao diện công khai. Là một vấn đề thực tế, * x * Đơn vị thường không được cấu trúc để có thể truy cập các phương thức riêng của lớp riêng biệt đang được thử nghiệm.
Vấn đề là không có phần còn lại của lớp được thiết lập để xử lý các bài kiểm tra đơn vị. Đây là thói quen đầu tiên sẽ có thử nghiệm dưới bất kỳ hình thức nào. Và rất khó để cấu hình lớp máy chủ một tập hợp các điều kiện ban đầu sẽ cho phép tôi kiểm tra việc gọi số CalculateSpeed
với mọi bộ đầu vào mà tôi muốn.
Lựa chọn duy nhất tôi có thể nhìn thấy, đang chuyển động tính tin này ra vào nó riêng của TCarCalculateSpeed
lớp:
public class TCarCalculateSpeed
{
public function CalculateSpeed(float furlogs)
{
Result = furlogs * 23;
}
}
Cả lớp, dành riêng cho phơi bày một phương pháp, đó là nghĩa vụ phải được tư nhân, chỉ vì vậy tôi có thể kiểm tra nó?
Nổ lớp.
Plus là riêng tư. Nếu tôi muốn nó được công khai, tôi muốn quảng cáo nó đến công khai khả năng hiển thị - ít nhất theo cách đó tôi lưu một lớp riêng biệt được tạo ra.
Tôi muốn thêm một số thử nghiệm đơn vị; nhưng nó chỉ có thể được thực hiện thành từng mảnh nhỏ, khi thay đổi mã. tôi không thể thiết kế lại hoàn toàn chức năng phần mềm 12 tuổi, có thể phá vỡ tất cả mọi thứ, bởi vì tôi muốn thử nghiệm một tính toán nội bộ.
hiện nay, tốt nhất, suy nghĩ của tôi là để thêm một phương pháp Test
đến lớp Car
của tôi, và chỉ cần gọi rằng:
TCar Car = new TCar();
Car.RunTests;
public procedure TCar.RunTests
{
Check(CalculateSpeed(0) = 0);
Check(CalculateSpeed(1) = 23);
Check(CalculateSpeed(2) = 46);
Check(CalculateSpeed(88) = -1);
}
Nhưng bây giờ tôi phải tìm ra cách để có TCar.RunTests
được trigged bởi bên ngoài TestRunner
, chỉ được thiết kế để sử dụng các lớp học TestCase
.
Lưu ý: Tôi đã cố gắng hết sức để kết hợp cú pháp từ nhiều ngôn ngữ. Nói cách khác: ngôn ngữ bất khả tri.
Tôi không biết cách làm theo cách bất khả tri về ngôn ngữ, nhưng trong VS/.NET, nó sẽ tạo ra một lớp Accessor, lớp bóng của bạn và làm mọi thứ công khai để bạn có thể kiểm tra nó. – CaffGeek
Đó có thể là câu trả lời có sẵn cho tôi. tôi phải tạo phương thức 'protected', thay vì' private', nhưng sau đó tôi có thể truy cập các thành viên được bảo vệ từ tệp mã kiểm thử đơn vị của tôi. –