使用 Moq 模拟接口 - 从不点击模拟方法

Mocking Interface using Moq - never hits the mocked method

我正在尝试为我的代码设置一个简单的单元测试。我有一个通过 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 的请求?

预计到达时间

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

UnitTest -> PaymentsService -> IPayments

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

var paymentService = new PaymentService(_mockIPayments.Object);

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

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

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

同样:

var paymentService = new PaymentService(_mockIPayments.Object);