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