模拟 Web 服务进行客户端层单元测试

3
我有一个业务规则Visual Studio类库(.NET 2.0)项目,它依赖于Dynamics Crm Web Services - 一个经典的SOAP Web引用,而不是WCF终结点。我想对这些业务规则进行单元测试,而不需要真正的crm实例。添加Web引用不会产生我可以伪造的接口。它会在我的项目中生成C#代码,如果我能创建接口,我认为我可以伪造它。我不认为我需要实际浏览HTTP并涉及所有协议内容。
我看到了Joh Skeet的博客文章。可惜,我不想写任何代码,希望有自那时以来编写的工具可以帮助我。我尝试了他的一些步骤,但得出结论他比我聪明,我无法使其工作。
我知道SoapUI,但是我希望能够在CI构建环境中使用纯单元测试。
有没有办法做到这一点?
1个回答

3

对于没有接口的东西进行模拟的标准方式是,在其周围构建自己的包装器。

你想要模拟的代码,比如说webservice相关的内容:

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();
    }
}

然后,在你的代码中,当你本应该调用生成的类时,请调用你的接口。在单元测试中,你可以使用模拟框架或者实现另一个没有依赖于生成内容的具体类来模拟接口。


很好的解释,我不明白为什么之前没有被投票支持。 - SwissCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接