我在模拟WCF服务方面遇到了一些问题:
1)我声明一个具有空方法的类,它只实现我的服务接口:
public class MyFakeService : IMyService {
...
public virtual MyResult GetResult(MyResponse response){
throw new NotImplementedException();
};
}
2)我有MyResponse课程:
public class MyResponse {
public long myField;
}
3)我创建了服务类的模拟和服务主机来托管这个假服务:
myFakeService = mocks.StrictMock<MyFakeService>();
ServiceHost host = new ServiceHost(myFakeService);
(这里我省略了端点配置等。)
4)现在我尝试测试我的客户端。 client.GetSomethingFromService()
方法正好调用服务的GetResult(MyResponse)
方法。
With.Mocks(mocks)
.Expecting(() => Expect
.Call(myFakeService.GetResult(null))
.IgnoreArguments()
.Constraints(PublicField.Value("myField", 777))
.Return(new MyResult()))
.Verify(() => myClient.GetSomethingFromService());
问题是,如果服务出现问题,我只能看到这样的内容:
System.ServiceModel.CommunicationObjectFaultedException:
The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used
for communication because it is in the Faulted state.
我怎么知道究竟是什么错?也许参数约束验证失败或其他东西......?
感谢。
答案 0 :(得分:1)
首先,避免使用严格的模拟。它们是一种不好的做法,因为它们会使你的测试变得太脆弱。
其次,如果您正在测试WCF服务,则不需要启动ServiceHost,因为您将进行集成测试。您只是想测试服务的逻辑,而不是WCF基础架构。
要了解如何使用RhinoMocks和WCF服务,请查看我在 unit testing WCF services上的博客文章