【发布时间】:2017-11-02 10:04:53
【问题描述】:
我正在尝试为我的代码设置一个简单的单元测试。我有一个通过 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
【问题讨论】:
-
起订量不是这样的。使用 _mockPaymentService.Object 而不是 paymentService
-
@Crowcoder _mockPaymentService 不是 PaymentService,而是 IPayments(这是 WCF 服务上公开的合约)。我已经更新了示例以反映,这可能会让你改变你的评论?
-
在这个特定的代码中,我不知道你会如何使用它,但 Moq 不会像某些框架(例如 MS Fakes)那样拦截所有后续调用。您必须使用模拟对象,否则您将使用实际实现。这通常与依赖注入一起完成。
-
是的,我知道你要去哪里。我倾向于使用可以进行这种拦截的犀牛模拟。也许我会按照你的建议重构使用 DI 并传入 mock.object 。谢谢
标签: c# unit-testing wcf moq