Phương pháp tĩnh thử nghiệm không khác gì so với thử nghiệm bất kỳ phương pháp nào khác. vì nó đã được đề cập - bạn không thể giả mạo/đặt nó với các công cụ miễn phí) Nhưng nếu bản thân phương pháp tĩnh là đơn vị được kiểm tra, bạn có thể chỉ đơn giản là treat it as working, reliable component. thử nghiệm đơn vị/TDD) với các phương pháp tĩnh khi:
- nó rất đơn giản, phương pháp đầu vào-đầu ra (tất cả các loại "tính toán này cho rằng")
- nó là đáng tin cậy, bởi những gì chúng tôi có nghĩa là nó là một trong hai đơn vị được kiểm tra bởi bạn hoặc xuất phát từ nguồn bên thứ 3 bạn là đáng tin cậy (ví dụ.
Math.Floor
có thể được coi là đáng tin cậy - sử dụng nó không được nâng cao "Hãy nhìn xem, nó tĩnh!" cảnh báo; người ta có thể giả định Microsoft thực hiện công việc của mình)
Khi phương pháp tĩnh sẽ gây ra vấn đề và cần tránh?Về cơ bản chỉ khi họ tương tác với/làm điều gì đó bạn không thể kiểm soát (hoặc giả):
- tất cả các loại hệ thống tập tin, cơ sở dữ liệu, phụ thuộc mạng
- phương pháp tĩnh (có thể phức tạp hơn) khác gọi từ bên trong
- khá nhiều bất cứ điều gì khuôn khổ mocking của bạn không thể đối phó với những điều kiện thường xuyên
Edit:hai ví dụ trên khi phương pháp tĩnh sẽ làm kiểm tra đơn vị khó
public int ExtractSumFromReport(string reportPath)
{
var reportFile = File.ReadAllText(reportPath);
// ...
}
Làm thế nào để bạn đối phó với File.ReadAllText
? Điều này rõ ràng sẽ đi đến hệ thống tập tin để lấy nội dung tập tin, đó là lớn không-không khi thử nghiệm đơn vị. Đây là ví dụ về phương pháp tĩnh với sự phụ thuộc bên ngoài. Để tránh điều đó, bạn thường tạo trình bao bọc xung quanh hệ thống tệp api hoặc đơn giản là chèn nó dưới dạng phụ thuộc/ủy nhiệm.
public void SaveUser(User user)
{
var session = SessionFactory.CreateSession();
// ...
}
gì về điều này? Phiên là không phụ thuộc phụ thuộc. Chắc chắn, nó có thể là ISession
, nhưng làm cách nào để buộc SessionFactory
trả về mô hình? Chúng ta không thể. Và chúng tôi không thể tạo ra dễ dàng để detemine đối tượng phiên.
Trong các trường hợp như trên, tốt nhất là tránh các phương pháp tĩnh hoàn toàn.
Nguồn
2012-05-17 09:35:07
điều gì sẽ xảy ra khi phương pháp tĩnh thực hiện tính toán và bạn không thể giả lập nó? Liệu nó đòi hỏi phải làm cho nó phương pháp dụ? – Pingpong
@Pingpong: Bạn có thể mở rộng một chút không? 'Math.Floor' thực hiện các phép tính - chúng ta có giả lập nó không? Không, bởi vì chúng ta biết 'Math.Floor (2.5)' sẽ trả về 2. Khi đầu vào-đầu ra là ** dễ xác định ** bạn không phải giả lập bất cứ điều gì (hoặc sử dụng cá thể). Toàn bộ * phương pháp tĩnh làm cho thử nghiệm cứng * xuất phát từ các tình huống khi chúng cung cấp các phụ thuộc không tầm thường hoặc có các tác dụng phụ. Xem chỉnh sửa của tôi. –
Điều gì về phương pháp tĩnh là một phương pháp tùy chỉnh thực hiện tính toán quá trình lâu dài? – Pingpong