我有一个使用Moq的测试问题。我在这里看了其他的moq答案,但我不太了解moq,能够判断他们是否回答了我的问题。
以下是代码背景: 我有一个服务'MyService',我需要调用方法'MyMethod'。
var response = myServ.MyMethod(request);
MyService是注入多个外部服务的构造函数。我也有这个类的公共接口。
public MyService(IExternalService1 serv1,
IExternalService2 serv2,
IExternalService3 serv3,
IExternalService4 serv4)
{
_serv1 = serv1;
_serv2 = serv2;
_serv3 = serv3;
_serv4 = serv4;
}
现在,MyMethod会对其中一个外部服务进行调用。 下面快速定义MyRequest和MyResponse。
public class MyRequest()
{
public int inId { get; set; }
}
public class MyResponse()
{
public int outId { get; set; }
}
所以MyMethod的实现是:
public MyResponse MyMethod(request)
{
return _serv3.DoSomething(request);
}
上述函数返回MyResponse的新对象,并将outId的值设置为一个值。
现在进行测试:
public void ShouldReturnValidOutId()
{
var myService = new Mock<IMyService>();
myService.Setup(
m => m.MyMethod(It.IsAny<MyRequest>())).Returns(new MyResponse() { outId = 5; });
var request = new MyRequest() { inId = 100 };
var response = myService ??? make my call to the MyMethod method ???
Assert.Equals(response.outId, 5);
}
现在我有两个问题:
1)如何调用MyMethod?
2)我认为我的整个模拟设置可能是错误的,因为我真的不想模拟MyService类,因为那是我实际测试的 但我想模拟_serv3(IExternalService3)。如何在.Setup()函数中设置它。
任何帮助表示感谢。
由于
答案 0 :(得分:3)
要测试MyService
不要嘲笑它 - 模拟其依赖项!简单的例子:
var service3Mock = new Mock<IExternalService3>();
service3Mock.Setup(m => m.DoSomething(It.IsAny<MyRequest>()))
.Returns(new MyResponse() { outId = 5; });
var myService = new MyService(null, null, service3Mock.Object, null);
var request = new MyRequest() { inId = 100 };
var response = myService.MyMethod(request);
Assert.Equals(response.outId, 5);