Csharp/C#教程:Moq – 如何模拟Web服务调用?分享


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

(0)
上一篇 2021年12月26日
下一篇 2021年12月26日

精彩推荐