【问题标题】:Moq mocking a function with expression parametersMoq 使用表达式参数模拟函数
【发布时间】:2019-09-06 09:04:02
【问题描述】:

我在我的 IRepository 中模拟一个函数时遇到问题,需要有关将准确模拟该函数的代码的帮助

我尝试在 Moq 中为 It 对象中的任何参数模拟函数,但无法解析

这是我的 IRepository 接口中 ListAsync 的函数声明,我需要使用 where 模拟第二个并包含参数

Task<IEnumerable<TEntity>> ListAsync(params Expression<Func<TEntity, object>>[] include);

Task<IEnumerable<TEntity>> ListAsync(Expression<Func<TEntity, bool>> where, params Expression<Func<TEntity, object>>[] include);

函数调用如下:

var result = await _unitOfWork.XXXRepository.ListAsync(p => p.clientId == clientId);

我尝试的代码是:

_unitOfWork.Setup(x => x.XXXRepository.ListAsync(p => It.IsAny<Expression<Func<XXX, bool>>>())).ReturnsAsync(XXXs.AsEnumerable());

_unitOfWork.Setup(x => x.XXXRepository.ListAsync(p => Id == id)).ReturnsAsync(XXXs.AsEnumerable());

_unitOfWork.Setup(x => x.XXXRepository.ListAsync(p => p.Id == 1)).ReturnsAsync(XXXs.AsEnumerable());

有趣的是,当真正的函数代码类似于Where(p=>p.Id ==1) 时,最后一个解决方案p=>p.Id ==1 可以工作,但是当我在Where(p=>p.Id == clientId) 等实际函数中将id 作为参数时它不起作用

我的意思是我手动准备数据以返回其中有 6 个项目,并且无法从模拟函数返回结果中获取任何列表项

对解决方案有什么想法吗?

【问题讨论】:

    标签: c# unit-testing asp.net-core moq


    【解决方案1】:

    如果您尝试模拟第二个重载,您应该可以这样做:

    _unitOfWork
        .Setup(x => x.XXXRepository.ListAsync(
            It.IsAny<Expression<Func<XXX, bool>>>(),
            It.IsAny<Expression<Func<XXX, object>>[]>()))
        .ReturnsAsync(XXXs.AsEnumerable());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2011-02-27
      • 2012-09-22
      • 2011-11-16
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多