【问题标题】:Moq Verify that Method was called with any expressionMoq 验证是否使用任何表达式调用了 Method
【发布时间】:2013-09-18 04:12:28
【问题描述】:

我是 Moq 的新手,我正在尝试模拟我的存储库。

我正在为其编写单元测试的方法是这样调用存储库:

var paymentState = _agreementPaymentStateRepository.SingleOrDefault(
                         s => s.Agreement.ID == agreementID);

我正在尝试这样设置我的起订量:

_agreementPaymentStateRepositoryMock
         .Setup(m => m.SingleOrDefault(s => s.AgreementID == 1))
         .Returns(AgreementPayMentStateMocks.GetOne);

我将我的模拟存储库传递给该类,但在调用后 paymentState 变量为空。 (我也很乐意跳过指定表达式)。

非常感谢任何帮助。

public PaymentState GetPaymentState(int agreementID)
    {
        try
        {
            _log.AgreementPaymentStateServiceGetStateStart(agreementID);
            var paymentState =
                _agreementPaymentStateRepository.SingleOrDefault(s => s.Agreement.ID == agreementID);

            var stateToGet = MapStateToGet(paymentState);

            _log.AgreementPaymentStateServiceGetStateReturn(agreementID, paymentState.LatestStatus);
            return stateToGet;
        }
        catch (Exception ex)
        {
            _log.ServiceException(ex.ToString());
            throw;
        }
    }

和测试:

 var paymentState = AgreementPayMentStateMocks.GetPayMentState();

        _agreementPaymentStateRepositoryMock.Setup(m => m.SingleOrDefault(s => s.AgreementID == 1)).Returns(AgreementPayMentStateMocks.GetOne);

        var service = new AgreementPaymentStateService(_agreementPaymentStateRepositoryMock.Object, _log.Object);
        var result = service.GetPaymentState(1);

        _agreementPaymentStateRepositoryMock.Verify(m => m.Match(aps => aps.SingleOrDefault(s => s.AgreementID == 1)), Times.Exactly(1));

【问题讨论】:

  • 如果可以的话,把所有代码都放在这里,有时你认为这不是问题的原因。
  • SingleOrDefault 不是扩展方法对吧?
  • @Ufuk,它的表达式传递到存储库...
  • 顺便说一句,你可以把.Verifiable()放在Setup的末尾,而不是做同样的事情,然后调用_agreementPaymentStateRepositoryMock.Verify();

标签: c# moq


【解决方案1】:

不要在 SingleOrDefault 调用中使用具体谓词,而是使用 Moq 的 It.IsAny<T> 方法:

_agreementPaymentStateRepositoryMock
         .Setup(m => m.SingleOrDefault(It.IsAny<Expression<Func<bool,PaymentState>>>()))
         .Returns(AgreementPayMentStateMocks.GetOne);

【讨论】:

  • 这就是我想要的。非常感谢你!
  • 这是如何工作的?我不认为静态方法(Select/Where)可以被嘲笑。
  • @DanRevell,我相信,基于上面的 cmets,SingleOrDefault 是存储库上的一个方法,而不是同名的扩展方法
猜你喜欢
  • 2016-06-12
  • 2011-10-02
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
相关资源
最近更新 更多