WSDL.exe - 生成接口以及具体类,以便以后轻松伪造/模拟

And*_*w M 7 .net testing soap mocking wsdl.exe

当它生成代理到Web服务时,是否可以让WSDL.exe生成接口以及代替具体类?

我们正在从ASP.Net应用程序中使用第三方Web服务,并且使用WSDL.exe生成了我们的代理类,并且很好.

我现在想通过伪造Web服务来编写针对我的包装器和业务类的测试.代理没有接口或抽象基类,它们被标记为内部,这意味着如果不将我的Fake/mock测试代码放入我的业务项目/程序集中,我就无法继承它们.

我可以手动创建一个接口(使用resharper)并编辑类,但是如果第三部分更改了他们的WSDL/Web服务我或者我的后继者还必须手动编辑接口,并自动生成类,这似乎从来没有像现在这样好理念.

伪造或嘲笑这项服务最优雅的方式是什么?我应该把假货放在商业项目中吗?我应该手动编辑文件并创建界面吗?我应该做一些完全不同的事吗?

And*_*w M 7

是的,在Philip的回答的推动下,我开始了一个,并且可能已经提出了一个有效的解决方案.使用WSDL.exe我生成了接口(使用/ si开关)普通代理类,并将它们都添加到我的业务项目中.

然后我创建了一个新类,它继承自具体类AND实现接口.这个小类基本上不包含代码,因为继承的具体成员提供了接口成员的隐式实现.代码第一次编译,我已经能够将这个小的"shim"(?adapter?)类替换为我的集成测试,并对现场的第三方服务器执行调用.

我现在可以创建实现接口的其他类(模拟或伪造),并替换它们而不是"shim"类.

编辑: 好的,我在这方面做了一些进一步的工作,除了一些复杂的工作.

第一个重要问题是代理类仍然标记为"内部",因此派生(适配器/填充程序)类也必须是内部的.如果您将一个Factory类放入您的业务项目/程序集中,而这是新的代理类,并将它们作为接口返回,则这不是问题.

我发现的第二个问题是我们明确地设置了webserice的URL和超时属性,但是它们不包含在接口中,而是通过SoapHttpClientProtocol从System.Web.Services.Protocols.WebClientProtocol继承.我再次在工厂处理这个问题,因为它是一个我很高兴不在界面中的实现细节.

编辑:在测试和开发我们的Facade时,这对我来说仍然很好.由于在接口后面获取代理,我还创建了一个日志装饰器类,它捕获大量示例调用以便使用调试,以及第三方服务器何时脱机.

我在这里写了更详细的内容:http://www.flowerchild.org.uk/archive/2010/09/21/mocking-or-faking-or-maybe-stubbing-a-wsdl -exe-soap.html