Phương pháp kiểm tra đơn vị gọi nhà cung cấp dịch vụ web


10

Tôi có một lớp học với một phương thức công khai Send()và một vài phương thức riêng tư. Nó gọi một vài dịch vụ web và xử lý phản hồi. Việc xử lý được thực hiện trong các phương pháp riêng tư.

Tôi muốn đơn vị kiểm tra mã. Sự hiểu biết của tôi là các bài kiểm tra đơn vị nên kiểm tra mã của tôi một cách riêng biệt (tức là giả lập các phản hồi của nhà cung cấp).

Tôi cũng tin rằng các phương thức riêng tư không cần phải được kiểm tra đơn vị Nhưng nếu tôi chỉ kiểm tra phương thức Send () thì mã của tôi không được kiểm tra độc lập và phụ thuộc vào phản hồi của nhà cung cấp.

Sau đó tôi có nên công khai các phương thức riêng tư của mình để tôi có thể kiểm tra chúng bằng các phản hồi giả không? Có vẻ như thực hành xấu vì tôi chỉ có lớp nên cần gọi họ.

Xin lỗi nếu đó là một câu hỏi cơ bản, tôi khá mới đối với thử nghiệm đơn vị.

Tôi đang sử dụng c # và VS2010


Nếu bạn không thử nghiệm một phương pháp riêng tư, làm thế nào để bạn biết nếu nó hoạt động?
Bryan Oakley

1
@BryanOakley bạn không cần biết rằng một phương thức riêng tư hoạt động, nó là riêng tư. Bạn biết rằng nó hoạt động bởi vì các phương thức công khai gọi nó vượt qua các bài kiểm tra của họ.
StuperUser

@Bryan Oakley có một cái nhìn vào liên kết
Tom Squires

Xin chào Tom, tôi đã cập nhật liên kết để làm cho nó nổi bật hơn và có văn bản liên kết phản ánh mục tiêu của nó. Xin vui lòng rollback.
StuperUser

Câu trả lời:


18

Bạn nên tách mã xử lý các dịch vụ web (tức là gửi và nhận dữ liệu) khỏi mã xử lý kết quả. Di chuyển mã sau vào một lớp riêng biệt, làm cho các phương thức cần thiết được công khai. Sau đó, bạn có thể dễ dàng kiểm tra đơn vị logic xử lý, tách biệt với các phụ thuộc bên ngoài.

Bằng cách này, bạn cũng làm cho mã của mình tuân thủ Nguyên tắc Trách nhiệm duy nhất . Theo nguyên tắc chung, cảm thấy cần phải thử nghiệm các phương thức riêng tư thường là một dấu hiệu cho thấy lớp có quá nhiều trách nhiệm, do đó nên được tái cấu trúc thành nhiều lớp.


3

Tôi nghĩ rằng một thử nghiệm với các phụ thuộc như vậy ( gọi các nhà cung cấp dịch vụ web ) là một thử nghiệm tích hợp chứ không phải là thử nghiệm đơn vị.


3

Như những người khác đã tuyên bố, nếu các thử nghiệm đơn vị của bạn có các phụ thuộc bên ngoài như các dịch vụ web hoặc các cuộc gọi cơ sở dữ liệu thì chúng hoàn toàn KHÔNG phải là thử nghiệm đơn vị, chúng là các thử nghiệm tích hợp.

Các thử nghiệm đơn vị thực sự có thể chạy độc lập với các thành phần bên ngoài ngoài thành phần mà chúng dự định thử nghiệm và nên được lặp lại bất kể môi trường. Nếu các dịch vụ web bên ngoài không hoạt động, bài kiểm tra đơn vị của bạn sẽ không bị lỗi.

Chúng tôi khắc phục điều này bằng cách sử dụng Mocking Framework. Các đối tượng giả cho phép chúng ta tạo ra một giả của một thành phần để thành phần trong thử nghiệm đơn vị của chúng ta sử dụng các đối tượng giả này thay vì các đối tượng thực. Chúng ta có thể đưa các đối tượng giả vào thành phần có thể kiểm tra được và chỉ định (các) đối số mà chúng ta đang mong đợi, những gì chúng ta muốn nó trả về khi nó được gọi, ngay cả ngoại lệ nào chúng ta muốn nó ném. Tôi đặc biệt khuyên bạn nên đọc thêm về chủ đề này vì nó sẽ cải thiện độ tin cậy và tính độc lập của các bài kiểm tra đơn vị của bạn.

Để có một bài viết hay trên các khung mô phỏng C # khác nhau, hãy xem chủ đề SO sau:

/programming/37359/what-c-mocking-framework-to-use

EDIT: Đối với sự nhạy cảm quá mức, tôi sẽ sở hữu rằng tôi đã bỏ qua việc đề cập đến DbUnit hoặc các công cụ giao dịch khác có thể khôi phục các thay đổi cơ sở dữ liệu khi kết thúc thử nghiệm. Đây cũng có thể lặp lại và có thể là bất khả tri về môi trường với dữ liệu thử nghiệm được tạo ra, do đó không cần đến Mocking Framework trong trường hợp này.


Ai đó có thể giải thích downvote? Tôi đã không trích xuất các cơ sở dữ liệu PHP, ROR, NoQuery, Javascript trên máy chủ, các sản phẩm của Apple hoặc bất kỳ xu hướng fab nào khác. Tôi vẫn VẪN có một downvote lái xe bằng mọi cách: S
maple_shaft

Tôi đoán ai đó không thích có bài kiểm tra đơn vị của họ được gọi là "hoàn toàn không phải bài kiểm tra đơn vị" (không phải tôi) :)
Daniel B
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.