在服务中使用moq进行服务

时间:2014-01-09 13:01:32

标签: c# unit-testing moq

我有一个使用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()函数中设置它。

任何帮助表示感谢。

由于

1 个答案:

答案 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);