【问题标题】:Mocking Interface using Moq - never hits the mocked method使用 Moq 模拟接口 - 永远不会遇到模拟方法
【发布时间】: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


【解决方案1】:

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

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

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

同样:

var paymentService = new PaymentService(_mockIPayments.Object);

【讨论】:

    【解决方案2】:

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

    var paymentService = new PaymentService(_mockIPayments.Object);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2014-09-28
      相关资源
      最近更新 更多