2014-04-25 11 views
8

Giả sử tôi đang sử dụng TDD để tạo một số lớp A. Sau khi hoàn thành và có thanh "xanh", tôi quyết định muốn trích xuất một số lớp B chỉ với các phương thức tĩnh từ lớp A sử dụng một số công cụ tái cấu trúc. Bây giờ tôi có lớp A và lớp B cả hai bài kiểm tra đầy đủ, nhưng chỉ qua lớp kiểm tra cho lớp A. Tôi có nên tạo lớp thử nghiệm cụ thể cho chức năng của lớp B, mặc dù đó có phải là kiểm tra trùng lặp không?Các lớp thử nghiệm đơn vị thông qua các lớp kiểm tra khác

+1

Bản sao: http://stackoverflow.com/questions/21482602/should-i-write-tests-for-class-a-if-its-covered-from-class-b/21482748#21482748 – Mik378

+0

Đẹp tìm, cảm ơn – jordan

Trả lời

12

Như mọi khi, nó phụ thuộc vào hoàn cảnh của bạn. Điều gì làm bạn quan tâm?

hành vi Nhìn chung

Nếu bạn đang xây dựng một hệ thống để sử dụng nội bộ, hoặc thậm chí dịch vụ một công cộng (web), nơi mà các phần mềm bạn đang vận chuyển là toàn bộ hệ thống, bạn không cần phải chăm sóc quá nhiều về một lớp học duy nhất. Nếu bạn đang xây dựng một hệ thống, sau đó kiểm tra hệ thống.

Miễn là nó được kiểm tra, bạn biết rằng hệ thống của bạn hoạt động chính xác. Tuy nhiên, bạn có thể gặp phải tình huống sau vài tháng, bạn nhận ra rằng bạn không cần lớp A gốc nữa, vì vậy bạn xóa nó và các bài kiểm tra đơn vị tương ứng của nó. Điều này có thể khiến phạm vi kiểm tra của B bị giảm, do đó, có thể là một ý tưởng hay để theo dõi các xu hướng bảo hiểm mã.

hành vi Unit

Nếu bạn đang xây dựng một (class) thư viện, hoặc khuôn khổ, bạn đang vận chuyển mỗi lớp công chúng như một phần của sản phẩm. Nếu bạn có nhiều người dùng thư viện của mình, bạn sẽ cần bắt đầu suy nghĩ về cách tránh các thay đổi đột phá.

Một trong những cách hiệu quả nhất để tránh thay đổi đột phá là bao gồm từng lớp theo bài kiểm tra đơn vị. Miễn là bạn don't change the tests, bạn biết rằng những thay đổi đột phá sẽ không xảy ra nếu tất cả các thử nghiệm đều có màu xanh lục. Tuy nhiên, điều đó đòi hỏi bạn phải kiểm tra tất cả các lớp học và thành viên công cộng của bạn.

Do đó, nếu bạn trích xuất B thành lớp công khai, giờ đây đây là lớp mà người tiêu dùng khác có thể phụ thuộc và sẽ là thay đổi đột ngột nếu bạn thay đổi. Vì vậy, bạn nên bao gồm nó với các bài kiểm tra mới. Nếu bạn đang xây dựng một đơn vị, hãy kiểm tra thiết bị.

+0

Tôi thêm vào đánh dấu câu trả lời Tôi muốn thêm rằng tạo ra một lớp như B là một mùi mã cho tôi. Nó không phải là cách đó tất nhiên, nhưng rất có thể là mục đích của nó sẽ không rõ ràng, và có lẽ là vi phạm các nguyên tắc SOLID. Nếu bạn thấy mình gặp vấn đề khi đặt tên cho lớp, đó có thể là trường hợp. – spacedoom

+0

@spacedoom Không phải là một chút khắc nghiệt? Việc trích xuất một lớp từ một lớp khác có thể là một Refactoring hoàn toàn hợp lệ. Thực tế là trong trường hợp này nó tĩnh có thể là một mùi mã, nhưng vì tôi biết rằng bạn là một fan hâm mộ F #, có lẽ một lớp tĩnh chỉ là một mô-đun chức năng chờ đợi để thực hiện. Tuy nhiên, SOLID nó không phải là, tôi đồng ý với điều đó :) –

+1

Tôi chắc chắn không có ý định khắc nghiệt, chỉ cần đưa ra và đối tượng theo định hướng bình luận cho một câu hỏi được gắn thẻ oop.Tôi đã không chọn giải nén các lớp học nói chung, chỉ các lớp như B. Tôi khá chắc chắn tên của nó sẽ là một cái gì đó giống như AHelper, và chúng tôi không muốn điều đó, phải không? Dù sao, bạn đang chết tiệt nó sẽ là tốt hơn nếu nó được viết như là mô-đun chức năng trong F #! :) – spacedoom

0

Từ những gì bạn đã mô tả câu trả lời là tạo một thử nghiệm mới khác. Nếu một trong hai thay đổi của bạn (hoặc người khác không quen thuộc với "bài kiểm tra chia sẻ") lớp kia sẽ không còn được kiểm tra nữa.

Nếu điều này dường như lãng phí, đặt mã kiểm tra chung trong một lớp thứ ba ...

Các vấn đề liên quan