2017-06-01 41 views
1

我正在尝试为我的代码设置一个简单的单元测试。我有一个接口和实现,通过WCF与外部服务对话。我试图用下面的代码来嘲笑这个;使用Moq的嘲讽界面 - 从来没有打嘲笑的方法

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

为了使它更清楚一点,流程是;

单元测试 - > PaymentsService - > IPayments

+0

这不是起订量是如何工作的。使用_mockPaymentService.Object而不是paymentService – Crowcoder

+0

@Crowcoder _mockPaymentService不是PaymentService,而是IPayments(它是WCF服务公开的合同)。我已经更新了这个例子来反映,这可能会让你改变你的评论? – ChrisBint

+1

在这个特定的代码中,我不知道如何使用它,但Moq不拦截所有后续调用,如一些框架(例如MS假货)。你必须使用模拟对象,否则你会使用实际的实现。这通常与依赖注入一起完成。 – Crowcoder

回答

1

您需要在嘲笑例如某种方式传递给服务。

var paymentService = new PaymentService(_mockIPayments.Object); 
0

只需指定一个设置,不会让Moq用指定的内容替换某个接口的所有实例。它只是定义了当某个Mock实例被调用时Moq会返回的内容。在你的情况下_mockIPayments

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

如果PaymentService正在创建一个IPayments对象在内部,使用嘲讽你将不得不使用像依赖注入,使您能够从外部指定IPayments实例,因此在测试中提供一个模拟实例。

同样:

var paymentService = new PaymentService(_mockIPayments.Object);