Bắt đầu với khái niệm này:
1) Bắt đầu với hành vi mà bạn mong muốn. Viết một bài kiểm tra cho nó. Xem thử nghiệm thất bại.
2) Viết đủ mã để vượt qua bài kiểm tra. Xem tất cả các bài kiểm tra vượt qua.
3) Tìm mã dự phòng / cẩu thả -> refactor. Xem xét nghiệm vẫn vượt qua. Đi 1
Vì vậy, trên # 1, giả sử bạn muốn tạo một lệnh mới (Tôi đang tìm hiểu cách thức hoạt động của lệnh, vì vậy hãy đồng ý với tôi). (Ngoài ra, tôi sẽ hơi thực dụng hơn là TDD cực đoan)
Lệnh mới được gọi là MakeMyLunch, vì vậy trước tiên bạn tạo một bài kiểm tra để khởi tạo nó và lấy tên lệnh:
@Test
public void instantiateMakeMyLunch() {
ICommand command = new MakeMyLunchCommand();
assertEquals("makeMyLunch",command.getCommandName());
}
Điều này không thành công, buộc bạn phải tạo lớp lệnh mới và để nó trả lại tên của nó (purist sẽ nói đây là hai vòng TDD, không phải 1). Vì vậy, bạn tạo lớp và yêu cầu nó thực hiện giao diện ICommand, bao gồm trả về tên lệnh. Chạy tất cả các bài kiểm tra hiện cho thấy tất cả vượt qua, vì vậy bạn tiến hành tìm kiếm cơ hội tái cấu trúc. Có lẽ là không.
Vì vậy, tiếp theo bạn muốn nó thực hiện thực thi. Vì vậy, bạn phải hỏi: làm thế nào để tôi biết rằng "MakeMyLunch" đã "ăn trưa" thành công. Những gì thay đổi trong hệ thống vì hoạt động này? Tôi có thể kiểm tra cái này không?
Giả sử nó dễ dàng để kiểm tra:
@Test
public void checkThatMakeMyLunchIsSuccessful() {
ICommand command = new MakeMyLunchCommand();
command.execute();
assertTrue( Lunch.isReady() );
}
Những lần khác, điều này khó khăn hơn và điều bạn thực sự muốn làm là kiểm tra trách nhiệm của bài kiểm tra dưới chủ đề (MakeMyLunchCommand). Có lẽ trách nhiệm của MakeMyLunchCommand là tương tác với Tủ lạnh và Lò vi sóng. Vì vậy, để kiểm tra nó, bạn có thể sử dụng một Tủ lạnh giả và Lò vi sóng giả. [hai khung giả mẫu là Mockito và nMock hoặc xem tại đây .]
Trong trường hợp đó, bạn sẽ làm một cái gì đó giống như mã giả sau đây:
@Test
public void checkThatMakeMyLunchIsSuccessful() {
Fridge mockFridge = mock(Fridge);
Microwave mockMicrowave = mock(Microwave);
ICommand command = new MakeMyLunchCommand( mockFridge, mockMicrowave );
command.execute();
mockFramework.assertCalled( mockFridge.removeFood );
mockFramework.assertCalled( microwave.turnon );
}
Người theo chủ nghĩa thuần túy nói kiểm tra trách nhiệm của lớp bạn - tương tác của nó với các lớp khác (lệnh có mở tủ lạnh và bật lò vi sóng không?).
Người theo chủ nghĩa thực dụng nói kiểm tra cho một nhóm các lớp và kiểm tra kết quả (bữa trưa của bạn đã sẵn sàng chưa?).
Tìm sự cân bằng phù hợp với hệ thống của bạn.
(Lưu ý: xem xét rằng có lẽ bạn đã đến cấu trúc giao diện của mình quá sớm. Có lẽ bạn có thể để điều này phát triển khi bạn viết các bài kiểm tra và triển khai đơn vị của mình, và trong bước # 3, bạn "nhận thấy" cơ hội giao diện chung).