【问题标题】:Mocking Web Services for client layer unit testing用于客户端层单元测试的模拟 Web 服务
【发布时间】:2011-08-11 17:56:40
【问题描述】:
我有一个业务规则 Visual Studio 类库 (.NET 2.0) 项目,它依赖于 Dynamics Crm Web 服务 - 一个经典的 SOAP Web 引用,而不是 WCF 端点。我想对这些业务规则进行单元测试,而不需要真正的 crm 实例。添加网络参考不会产生我可以伪造的界面。它确实会在我的项目中生成 c#,如果我可以创建接口,我认为我可以伪造。我认为我不需要真正浏览 HTTP 并了解所有协议内容。
我看到了 Joh Skeet 的 blog post。唉,我不想编写任何代码,我希望从那时起已经编写了一个工具,这可能会有所帮助。我尝试了他的一些步骤,但得出的结论是他比我聪明,我无法做到这一点。
我知道 SoapUI,但是,我希望纯单元测试可以在 CI 构建环境中工作。
有没有办法做到这一点。
【问题讨论】:
标签:
web-services
unit-testing
【解决方案1】:
模拟没有接口的东西的标准方法是围绕它构建自己的包装器。
你想模拟的代码,比如网络服务的东西:
class AutoGeneratedStuff
{
public string GeneratedMethodYouUse()
{...}
public string GeneratedMethodYouDontNeed()
{...}
}
然后你创建一个只包含你需要的代码位的接口:
public interface IWebServiceClient
{
string MethodYouUse();
}
以及实现它的具体包装类,它依赖于生成的东西
class WebServiceClient : IWebServiceClient
{
private AutoGeneratedStuff _stuff;
public WebService(AutogeneratedStuff stuff)
{
_stuff = stuff;
}
public string MethodYouUse()
{
return _stuff.MethodYouUse();
}
}
然后,在您的代码中,当您调用生成的类时,改为调用您的接口。在您的单元测试中,您可以使用模拟框架来模拟接口,或者通过使用另一个与生成的东西没有依赖关系的具体类来实现接口