使用Moq模拟接口 - 永远不会遇到模拟方法

时间:2017-06-01 10:00:19

标签: c# unit-testing wcf moq

我正在尝试为我的代码设置一个简单的单元测试。我有一个通过WCF与外部服务通信的接口和实现。我试图用下面的代码嘲笑这个;

private Mock<IPayments> _mockIPayments;

_mockIPayments.Setup(x => x.GetCreditCard(It.IsAny<GetCreditCardRequest>())).Returns(getCreditCardResponse);

在单元测试中,我创建了一个最终调用WCF服务的服务实例;

var paymentService = new PaymentService();

var response = paymentService.GetCardDetails(cardId);

在PaymentService本身内,代码;

var response = ServiceInvoker.Invoke<IPayments, GetCreditCardRequest, GetCreditCardResponse>
                          (
                              "Payments",
                              request,
                              (proxy, req) => proxy.GetCreditCard(req));

(请注意,ServiceInvoker.Invoke只是创建频道和处理请求的包装器)

我是否遗漏了某些内容,如果模拟设置没有捕获到GetCreditCard的请求?

ETA

为了使它更清晰,流程是;

UnitTest - &gt; PaymentsService - &gt; IPayments

2 个答案:

答案 0 :(得分:1)

您需要以某种方式将您的模拟实例传递给服务。

var paymentService = new PaymentService(_mockIPayments.Object);

答案 1 :(得分:0)

简单地指定设置不会让Moq用您指定的内容替换某些接口的所有实例。它只是定义了当调用某个Mock实例时Moq将返回的内容。在您的情况下_mockIPayments

然后,您必须在代码中使用该模拟的IPayments实例(在构造函数或方法中传递它),以便您的代码实际使用它。

如果您的PaymentService当前正在内部创建IPayments对象,要使用模拟,您必须使用依赖注入之类的内容,以便您能够在外部指定IPayments实例,因此在测试中提供了一个模拟实例。

同样地:

var paymentService = new PaymentService(_mockIPayments.Object);