2009-01-02 41 views
8

Tôi có một ứng dụng đang sử dụng dịch vụ WCF. Bây giờ tôi muốn thêm các bài kiểm tra đơn vị vào ứng dụng.Cách dễ dàng để thử một dịch vụ WCF?

Đối với một số trường hợp, tôi cần giả lập dịch vụ WCF, vì việc nhận được hành vi mong muốn từ dịch vụ đôi khi rất khó khăn (ví dụ: dịch vụ ném ngoại lệ đặc biệt).

Tôi có thể thêm một giao diện khác vào ứng dụng khách wcf, nhưng điều này có vẻ hơi ngớ ngẩn, vì các cuộc gọi của khách hàng đã sử dụng giao diện.

Có cách nào dễ dàng để thử dịch vụ WCF không? Dễ dàng hơn việc tạo một lớp giao diện khác và chuyển hướng mọi cuộc gọi WCF đơn lẻ bên trong nó?

Edit: Hầu hết các câu trả lời dường như không biết nhiều về dịch vụ WCF sử dụng, vì vậy một số làm rõ:
Để sử dụng một dịch vụ WCF từ một ViewModel, tôi phải quản lý một cái gì đó kết nối như thế này:

ChannelFactory<IMyWcfService> channelFactory = new ChannelFactory<IMyWcfService>(""); 
IMyWcfService proxy = channelFactory.CreateChannel(); 
proxy.CallMyStuff(); 
proxy.Close(); 

Tôi không thể vượt qua ViewModel proxy đến WCF, vì kết nối cần phải được mở và đóng cho mỗi giao dịch. Vì lý do này, việc sử dụng RhinoMock/NMock sẽ không hoạt động, vì họ cần một ViewModel nhận proxy như một tham số, không thể thực hiện như thế này nếu bạn sử dụng WCF.

Trả lời

9

Tại sao bạn không thể sử dụng một cái gì đó như NMock2 để giả lập giao diện IMyWcfService trực tiếp?

Nếu bạn cần để có thể tạo phiên bản mới khi đang bay, hãy sử dụng Nhà máy để ẩn số ChannelFactory<IMyWcfService> từ ứng dụng khách. Bằng cách này bạn có thể thay thế các nhà máy, cung cấp cho khách hàng một trong đó tạo ra mocks thay vì proxy thực sự.

+0

+1 trên chế độ mô phỏng trực tiếp giao diện. –

+0

vui lòng cung cấp ví dụ – PositiveGuy

+0

ChannelFactory là gì? – PositiveGuy

2

Bạn có thể sử dụng bất kỳ khuôn khổ mocking nào như RhinoMocks hoặc NMock, để giả lập hợp đồng giao diện, vì vậy nếu dịch vụ của bạn triển khai IMyService thì bạn có thể sử dụng khung mocking để đặt kỳ vọng về phương thức gọi trên giao diện đó. Nếu bạn không quen thuộc với khái niệm này thì bạn có thể chỉ cần tạo một đối tượng đứng sẵn để triển khai IMyService nhưng giả vờ là dịch vụ thực sự trong quá trình thử nghiệm của bạn. Bằng cách này, khi các phương thức được gọi là chúng được gọi trên đối tượng đứng của bạn và bạn có thể có sự trở lại độc lập của mình bất cứ điều gì bạn muốn.

+0

Sử dụng RhinoMock/NMock Tôi cần mở kết nối với dịch vụ WCF, chuyển proxy cho ViewModel và đóng nó sau khi sử dụng. Vì các kết nối WCF thường có thời gian chờ ngắn, và nên được mở và đóng cho mọi giao dịch, đây là một sự cố. – Sam

+0

Nói cách khác: bạn không thể sử dụng RhinoMock/NMock để giả lập giao diện WCF. Ít nhất không phải là tôi biết, nếu bạn biết một cách, xin vui lòng chia sẻ nó. – Sam

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