2009-08-17 35 views
9

Tôi đã tạo một vài giao diện thông thạo nhỏ thông qua chuỗi phương thức. Chúng thường gọi một số Repositories lấy dữ liệu từ webservices/databases.Làm cách nào để mã kiểm tra đơn vị sử dụng giao diện Thông thạo?

Tôi nên sử dụng phương pháp thử nghiệm đơn vị sử dụng giao diện thông thạo như thế nào?

Public IEnumberable<Computer> FindComputers(string serialNumber) 
{ 
     return Computers.FindBySerialNumber("YBCX00900") 
     .AttachConfiguration() 
     .EnsureAllComputersHaveConfiguration(); 
} 

Tôi có thể kiểm tra đơn vị thành phần riêng lẻ của giao diện thông thạo, nhưng nếu tôi muốn đơn vị kiểm tra phương pháp FindComputers ở trên thì nên làm gì?

  1. Sử dụng thực hiện cụ thể của giao diện thông thạo, và viết mong đợi trên các lớp Repository
  2. Mock giao diện thông thạo bản thân và thiết lập những kỳ vọng về điều đó
  3. thử nghiệm chỉ có giao diện thông thạo bản thân, và không phải là FindComputers() phương thức

Tôi muốn tìm cách tiếp cận dễ bảo trì.

Trả lời

3

Tôi nghĩ rằng FI đang làm nhiều hơn mức cần thiết. Tôi cho rằng bạn đang sử dụng Máy tính làm người lập bản đồ dữ liệu và cũng sử dụng nó để tạo truy vấn. Từ những gì bạn đã cho thấy các truy vấn được xây dựng từ này:

rule 1: find configured computer with serial number = "whatever" and has-config = true. 
rule 2: find not-config computer with serial number = "whatever and has-config = true. 
rule 3: find configured computer with serial number = "whatever" and has-config = false. 
rule 4: find not-config computer with serial number = "whatever" and has-config = false. 
rule 5: find all computer with serial number = "whatever" and has-config = true. 
rule 6: find all computer with serial number = "whatever" and has-config = false. 

và vân vân ...

Bây giờ một số các quy tắc này có thể được thực hiện dường như là không chính xác. quy tắc 2 và quy tắc 3 dường như có mục đích chéo. quy tắc 5 và quy tắc 6 làm gì? Điều này có đúng không?

Vì bạn đã triển khai một đối tượng phá vỡ SRP. Bước đầu tiên là ngắt trình tạo truy vấn từ trình ánh xạ dữ liệu. Xây dựng đối tượng truy vấn FI của bạn sau đó chuyển nó vào trình ánh xạ.

Bây giờ bạn có thể thử nghiệm FindComputers đảm bảo rằng đối tượng truy vấn FI được gửi đến người lập bản đồ dữ liệu. Bởi vì bây giờ bạn có thể xây dựng một đối tượng truy vấn FI, bạn có thể kiểm tra nó. Và bạn có thể kiểm tra rằng trình ánh xạ dữ liệu sử dụng một đối tượng truy vấn.

Điều gì xảy ra nếu trong tương lai bạn muốn tìm máy tính theo vị trí. Nếu bạn giữ cùng một mã như bạn đã viết, bạn sẽ phải thêm một phương thức FindByLocation và trước khi bạn biết nó bạn có một đối tượng thần. hôi!

+0

Cảm ơn, bạn đúng ví dụ là suy nghĩ kém, tôi đã kể từ khi chia nhỏ FI thành một cho truy vấn, và một để thực hiện các hoạt động trên dữ liệu trả về. Tôi đã tìm thấy nó dễ dàng nhất để đơn vị kiểm tra FI trong sự cô lập, và sau đó đơn vị phương pháp thử nghiệm sử dụng FI với việc thực hiện cụ thể. Chỉ cần kiểm tra kết quả mong muốn được trả về. Cố gắng để thử FI chỉ làm cho các bài kiểm tra quá giòn. – Andronicus

0

Tôi sẽ làm 2 + 3. Giả sử các giao diện thông thạo là các giao diện thực sự, chúng nên tương đối đơn giản để giả lập. Chỉ cần nhận ra từng bước trong chuỗi cuộc gọi có lẽ sẽ trả về một đối tượng giả mới, đó là lần lượt mong đợi cuộc gọi tiếp theo trong chuỗi.

Bạn vẫn nên kiểm tra giao diện thông thạo trực tiếp, giả mạo lớp kho lưu trữ bên dưới chúng.

+0

Cảm ơn cho đầu vào, Tôi nghĩ về chế giễu giao diện thông thạo chính nó, nhưng nó chỉ có vẻ kỳ quặc để viết bài kiểm tra như ... Expect (x => x.FindBySerialNumber (null)).Return (nextMock) Mong đợi (x => x.AttachConfiguration()). Quay trở lại (nextMock) khi tất cả nó kiểm tra là các cuộc gọi thực sự được thực hiện. Đó là rất nhiều công việc để tái tạo toàn bộ giao diện thông thạo trong các đối tượng giả, chỉ để kiểm tra những gì đã được viết rõ ràng trong phương pháp được thử nghiệm. – Andronicus

+0

Tôi mới làm bài kiểm tra bài kiểm tra đơn vị và đôi khi có cùng một cảm giác. Mặc dù dễ dàng xem xét mã bằng cách kiểm tra nhưng đó vẫn là đánh giá thủ công. Việc thêm phạm vi kiểm tra giúp bảo vệ bạn khi bạn không còn suy nghĩ về lớp học này nữa. Đây cũng có thể là dấu hiệu cho thấy giao diện thông thạo phức tạp hơn mức cần thiết - nếu giao diện tập trung hơn vào những gì bạn cần, các bài kiểm tra cũng sẽ đơn giản hơn để viết. –

1

Bạn có thể giả lập kho lưu trữ của mình không? Trong khi một số sẽ ủng hộ một cách tiếp cận thuần túy hơn, nơi bạn phải cô lập một phương thức của một lớp, nó sẽ là một cách tốt để kiểm tra cách FindComputers và giao diện thông thạo làm việc cùng nhau. Và nó có thể đơn giản hơn, tùy thuộc vào lớp truy cập Repository trông như thế nào.

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