2013-03-01 42 views
24

Tôi muốn tạo một lớp thử nghiệm cho một dịch vụ WCF. Tôi tin rằng "chế nhạo" là thuật ngữ đúng đắn cho điều này?Thử nghiệm dịch vụ web WCF?

Tôi không thực sự chắc chắn rằng cách tôi nghĩ rằng tôi phải làm điều này là đúng cách. Tôi đã nhận được một URL đến một dịch vụ WCF, ví dụ:

http:://somesite.com/wcf/RealService.svc 

Và:

http:://somesite.com/wcf/RealService.svc?wsdl 

Vì vậy, thay vì thực sự thêm RealService.svc để dự án của tôi như Service Reference tôi chỉ đơn giản là thêm một mới có sản phẩm nào WCF Service để dự án của tôi có tên là Service1.

Sau đó tôi muốn sử dụng công cụ wsdl.exe (hoặc có thể là svcutil.exe?) Để tạo giao diện từ địa chỉ WSDL: http:://somesite.com/wcf/RealService.svc?wsdl.

Sau đó, tôi mở tệp Service1.cs và thay vì cho phép được kế thừa từ IService1.cs tôi để nó kế thừa từ số interface được tạo.

Sau đó, thay vì gọi dịch vụ thực trong ứng dụng của tôi, tôi chỉ cần gọi cho lớp Service1 của mình. Đó là cách chế nhạo một dịch vụ web hoạt động ..?

Cũng cần phải tìm ra cách để thực sự tạo ra một interface với công cụ svcutil (tôi đã đọc mà tôi không thể sử dụng wsdl.exe cho một dịch vụ WCF?). Vì vậy, bất kỳ lời khuyên trên đó là nhiều hơn chào đón là tốt!

+0

http://www.codeproject.com/Articles/318260/How-to-Mock-a-WCF-Service – Zaki

+0

@Zaki - Tôi nghĩ rằng bài viết có lẽ nên được mang tên "Cách KHÔNG mô phỏng dịch vụ WCF" – mungflesh

Trả lời

18

Nhiều khu vực để chạm vào sẽ cố gắng chỉ cho bạn hướng đúng:

  • Nếu bạn muốn kiểm tra (tức là vượt qua đầu vào, kiểm tra đầu ra) dịch vụ WCF của bạn, sử dụng công cụ GUI Visual Studio WCF Test Client (bài viết MSDN here).

  • Nếu bạn muốn thử dịch vụ WCF của bạn (ví dụ: đơn vị kiểm tra thành phần của bạn mà tiêu thụ các dịch vụ WCF), sử dụng một khuôn khổ mocking như NMock2 cho phép bạn thử giao diện dịch vụ (liên quan đến thread SO here). Bạn cũng có thể viết mã bằng tay (bằng cách thực hiện giao diện), nếu bạn không muốn sử dụng một khung bên ngoài - nhưng điều này có liên quan nhiều hơn.

  • Nếu bạn muốn đơn vị kiểm tra dịch vụ WCF của bạn (ví dụ: viết kiểm tra đơn vị dịch vụ, kinh doanh, dữ liệu, v.v.), sử dụng khung mocking phổ biến (có liên quan SO thread here).

  • Để tạo proxy cho dịch vụ WCF của bạn, hãy sử dụng tiện ích dòng lệnh svcutil.exe (bài viết MSDN here) như bạn đã đoán. Tiện ích này đi kèm với các tùy chọn khác nhau (ngôn ngữ, không gian tên, tệp cấu hình, v.v.), vì vậy hãy chú ý đến chúng.

Hy vọng điều này sẽ hữu ích.

+0

Vì vậy, ngoài việc thêm một tham chiếu dịch vụ vào cho phép nói một dự án C# mới sẽ tạo ra một proxy máy khách cho bạn, sự khác biệt của việc đó là gì so với việc sử dụng svcutil.exe. Tại sao bạn muốn sử dụng nó so với chỉ cần thêm một tham chiếu đến dự án của bạn mà sẽ làm điều tương tự phải không? hoặc có thể không. Tôi đang cố gắng để hiểu thêm về proxy của khách hàng về kiểm tra chúng trong WCF – PositiveGuy

+0

@CoffeeAddict - Cả hai cách tiếp cận (tham chiếu dự án hoặc svcutil) hoạt động hoàn hảo. Trong cách tiếp cận trước đây, Visual Studio thực hiện một số "đằng sau hậu trường ma thuật" và tạo ra một loạt các tập tin, điều này dễ dàng hơn để cập nhật. Tuy nhiên, trong cách tiếp cận thứ hai, bạn đối phó với một tệp proxy, nhưng yêu cầu bạn chạy lại lệnh để cập nhật. Tôi thích cái thứ hai, vì tôi thích một tập tin proxy để kiểm soát nguồn của tôi và tôi không nhớ quá trình cập nhật thông qua dòng lệnh. Có ý nghĩa? – Channs

3

Bạn có thể tạo cho bạn proxy sử dụng các svcutil.exe (từ Visula Studio: Thêm một tham khảo dịch vụ ...). Thao tác này sẽ tạo proxy ứng dụng khách của bạn và Giao diện dịch vụ.?

Đối dụ cho dịch vụ của bạn http :: //somesite.com/wcf/RealService.svc wsdl chúng tôi sẽ nhận được:

  • IRealService (giao diện)
  • RealServiceClient (thực hiện IRealService và mở rộng hệ thống. ServiceModel.ClientBase)

Bạn có thể tạo một lớp mô hình thực hiện giao diện dịch vụ của bạn (IRealService).

Và trong ứng dụng của bạn thay vì instanciating khách hàng dịch vụ cụ thể (RealServiceClient) khi bạn muốn gọi dịch vụ của bạn, bạn có thể sử dụng một nhà máy hoặc một container IOC.

Bằng cách này bạn có thể quyết định trường hợp ứng dụng của bạn (hoặc mô-đun/thành phần) hoạt động với: dịch vụ thực trong thời gian chạy, giả lập khi thử nghiệm.

+0

Tôi đã thấy ai đó chỉ cần thêm tài liệu tham khảo dự án WCF của họ vào dự án thử nghiệm C# của họ và thậm chí không cần phải thêm một tham chiếu dịch vụ cho dự án C# của họ, là có thể hoặc phải làm? Ngoài ra, không phải là điểm mocking không sử dụng dụ dịch vụ ở tất cả, ngay cả khi bạn đang tiêm nó? Nó phải được cô lập, do đó, không phải là khuôn khổ mocking tạo ra một trường hợp dịch vụ giả cho bạn hoặc một cái gì đó như thế? – PositiveGuy

+0

Khi bạn gọi lệnh ** Add a Service Reference ... **, bạn sẽ nhận được một số mã được tạo mà bạn có thể sử dụng như * mã thông thường *. Ý tôi là, bạn có thể tham khảo assembly nơi các lớp ** proxy ** được tạo ra và sử dụng chúng mà không cần phải gọi lại lệnh ** Add a Service Reference ... ** (ví dụ trong một dự án thử nghiệm). Vấn đề * là hợp đồng ('giao diện') và việc thực thi (' classes') được tạo ra trong cùng một tệp (do đó cùng một assembly), nhưng không có gì ngăn cản bạn tạo ra việc thực thi 'mock' trong dự án thử nghiệm của bạn. – polkduran

+0

Miễn là ứng dụng chính của bạn xử lý 'giao diện' thay vì triển khai thực hiện cụ thể, bạn có thể quyết định ** tiêm ** triển khai dịch vụ * thực * hoặc lớp * mock *, ví dụ khi bạn đang thử nghiệm hoặc bạn không muốn để gọi các dịch vụ * thực * (ví dụ: khi tạo mẫu). Đó là điểm * chế nhạo *. – polkduran

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