2012-05-17 32 views
16

Cập nhậttĩnh lớp/phương pháp/bất động sản trong đơn vị kiểm tra, ngăn chặn nó hay không

nên một lớp tĩnh/phương pháp/bất động sản được sử dụng trong một môi trường đơn vị phát triển kiểm tra, cho rằng nó không có cách nào để kiểm tra nó mà không giới thiệu một wrapper đó là một lần nữa không thể kiểm tra?

Một trường hợp khác là khi các thành viên tĩnh được sử dụng trong mục tiêu được kiểm tra đơn vị, bộ ghi tĩnh không thể được mô phỏng. Vì vậy, bạn phải kiểm tra các meem tĩnh khi mục tiêu thử nghiệm đơn vị được kiểm tra. Bạn muốn cô lập nó khi thành viên tĩnh thực hiện tính toán.

Trả lời

32

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.

+1

đ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

+2

@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. –

+0

Đ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

2

Bạn không thể giả lập các phương thức/thuộc tính tĩnh. Vì vậy, khi classA sử dụng một số thành viên tĩnh của classB bạn không thể kiểm tra classA cách ly.

CẬP NHẬT: Tôi không thấy bất kỳ vấn đề gì khi gói một số lớp tĩnh vào đối tượng. Nó không mất nhiều thời gian, nhưng nó cho phép bạn giảm khớp nối trong hệ thống của bạn.

4

Phương pháp tĩnh CAN là đơn vị được kiểm tra. Chúng không thể bị nhạo báng (nói chung, có một số khuôn khổ để thực hiện điều này như là Moles.

+0

Nhưng điều này là quá mức cần thiết cho các trường hợp đơn giản. Các nốt ruồi tích hợp trong quá trình xây dựng và chỉ có sẵn cho .net – undefined

0

Về mặt kỹ thuật, bạn có thể giả lập phương pháp tĩnh trong Java với PowerMock, nhưng nếu bạn cần làm điều này, tôi nghiêm túc khuyên bạn nên cấu trúc lại mã của bạn. Tôi nghĩ rằng các phương thức tĩnh phải luôn là private và chỉ được sử dụng bên trong các lớp mà chúng được định nghĩa trong, cho các mục đích nội bộ. Tôi xem xét phương pháp tĩnh được hiển thị công khai là a code smell.

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