Moq – 如何模拟Web服务调用?
下面的using
命中了我不想实际命中的外部资源。 我想测试someResult
和使用它的代码,但每次运行我的unit testing时,这段代码仍然试图点击真正的Web服务。 我如何使用moq来伪造对Web服务的真实调用,但不使用模拟其他代码?
public IMyInterface.SomeMethod() { // hits a web service using ( mySoapClient client = new mySoapClient() ) { var someResult = client.DoSomething(); ... ... } } [TestMethod()] public void SomeMethodTest() { IMyInterface target = new MyInterface(); target.SomeMethod(); // Assert.... }
您需要将Web服务实现与使用者分离
public class ClassIWantToTest { public ClassIWantToTest(IServiceIWantToCall service) {} public void SomeMethod() { var results = service.DoSomething(); //Rest of the logic here } }
现在您可以使用Moq来模拟IServiceIWantToCall
以测试SomeMethod
的逻辑
您首先必须能够注入Web服务。 在SomeMethod()中创建一个新的方法将方法“紧密地”耦合到生产代码; 你不能动态地告诉它创建mySoapClient以外的东西。
由于您要创建和销毁它们,我可以建议您要测试的代码接受Func
作为方法参数或构造函数参数。 它看起来像这样:
public IMyInterface.SomeMethod(Func clientFactory) { // hits a web service using ( mySoapClient client = clientFactory() ) { var someResult = client.DoSomething(); ... ... } }
… 要么:
public class MyClass:IMyInterface { private Func MySoapClientFactoryMethod; public MyClass(Func clientFactoryMethod) { MySoapClientFactoryMethod = clientFactoryMethod; } ... public IMyInterface.SomeMethod() { // hits a web service using ( mySoapClient client = MySoapClientFactoryMethod() ) { var someResult = client.DoSomething(); ... ... } } }
现在,当您创建要测试的对象时,您定义了一个函数,该函数生成Soap服务的相应Moq模拟,它具有您期望从真实客户端获得的行为而没有副作用(包括能够告诉它代码Dispose()d的客户端),并将该函数传递给您正在测试的类或方法。 在生产中,您可以简单地将函数定义为()=>new mySoapClient()
,或者您可以设置IoC框架并将mySoapClient注册为IMySoapClient,然后还注册MyClass; 大多数IoC框架足够智能,可以将委托视为参数,并生成注入已注册依赖项的方法。
为了添加pickles的答案,我为当前的名为IService
服务调用创建了一个interface
。 然后我创建了一个ServiceMock
类,它inheritance了接口并添加了一个名为_service
的全局变量。 在构造函数中,我实例化mock服务并设置接口的所有方法:
public class ServiceMock : IService { Mock _serviceMock; public ServiceMock() { _serviceMock = new Mock (); _serviceMock.Setup(x => x.GetString()).Returns("Default String"); SomeClass someClass = new SomeClass(); someClass.Property1= "Default"; someClass.Property2= Guid.NewGuid().ToString(); _serviceMock.Setup(x => x.GetSomeClass()).Returns(someClass); } public string GetString() { return _serviceMock.Object.GetString(); } public License GetSomeClass() { return _serviceMock.Object.GetSomeClass(); } }
然后,将此类注入代码而不是实际的Web服务。 它将返回您设置的值以返回。 您现在可以在不依赖Web服务的情况下进行测试。
上述就是C#学习教程:Moq – 如何模拟Web服务调用?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/997134.html