如何模拟我无法控制的服务(我可以访问的外部公司服务,但在运行我的单元测试时不想点击)。
我在C#.NET 4.6中编写我的消费者。我的目标是能够测试我的消费者的内部工作(然后是消耗它的库代码)而不实际访问远程服务。不幸的是,远程服务相当复杂,并且拥有大量的呼叫和类型。
非常感谢任何帮助或指示。
编辑:立即投票后没有评论;请允许我补充一点:我已经对此进行了调查,但遗憾的是没有得到帮助我的答案。也许只是糟糕的搜索条件。
编辑2:远程服务是asmx。我的消费者是一个.net 4.6库,它将作为任何消费用户界面的控制库(无论是wpf,winform,mvc等)。
答案 0 :(得分:1)
您可以将外部服务功能抽象到一个接口(IExternalService)中,然后为它创建另一个实现(除了原始实现之外),模拟一个:MockExternalService。这个可能就像返回一些虚拟数据一样简单,或者也可以在内部有一些逻辑(例如,根据方法参数中的某个输入返回不同的响应)。
然后,您需要连接所有这些,以便通过某种机制(例如,自定义标头/ web.config设置/数据库设置),您的消费者可以在两种不同的服务实现之间进行交换(这有点暗示您是使用依赖注入)。
答案 1 :(得分:0)
右键单击导入的Service Reference类,选择“Extract Interface”,即可获得模拟的开头。将引用具体服务引用类的所有现有代码更改为引用新接口,然后在创建具体类的新实例的位置,使用您喜欢的IOC框架将该代码替换为工厂(或者自己编写工厂)。
然后创建一个“TestServiceEndpoint”类,实现提取的接口并开始编写模拟响应。
或者使用Visual Studio Fakes功能创建一个Fake实现并用它编写测试。这仅适用于单元测试框架环境,因此如果您试图将端点存根以便可以测试应用程序的其余部分,那么第一种方法是最好的。