Moq Mock lambda表达

时间:2017-04-07 08:33:17

标签: c# unit-testing moq

我正在尝试模拟执行lambda表达式的存储库。我想要执行的方法如下所示:

public SelectListItem GetProtocolById(int protocolId)
{
    var protocol = UnitOfWork.ProtocolRepository.FindAll(s => s.PROTOCOL_ID == protocolId).FirstOrDefault();
    return new SelectListItem()
    {
        Text = protocol.USER_DEFINED_ID,
        Value = protocolId.ToString()
    };
}

我在另一个类

中创建了一个mockRepository
protected MockRepository mockRepository = new MockRepository(MockBehavior.Default);

我有一个UnitOfWork和一个协议存储库,我这样模仿它们:

var protocolRepositoryMock = mockRepository.Create<IRepository<PROTOCOL>>();
var unitOfWorkRBMMock = mockRepository.Create<IUnitOfWorkRBM>();

IRepository中的FindAll方法如下所示:

IEnumerable<TEntity> FindAll(Expression<Func<TEntity, bool>> where, params Expression<Func<TEntity, object>>[] includes);

我的IUnitOfWorkRBM中的IRepository定义是这样的:

IRepository<PROTOCOL> ProtocolRepository { get; set; }

我试图模仿unitOfWorkMock,因为它能够像这样执行lambda表达式:

 unitOfWorkRBMMock.Setup(s => s.ProtocolRepository.FindAll(It.IsAny<Expression<Func<PROTOCOL, bool>>>()))
                .Returns(new Func<Expression<Func<PROTOCOL, bool>>, IEnumerable<PROTOCOL>>(
                expr => protocolsList.Where(expr.Compile())));

但是当我尝试调用GetProtocolById方法时,协议为空。

关于我在这里做错了什么想法?

2 个答案:

答案 0 :(得分:1)

可以使用npm install primeng@x.x.x --save 方法访问提供的表达式的值。用它来过滤假名单

查看以下用于解决问题的最小示例。

Returns

答案 1 :(得分:0)

您不需要编译 - 您可以直接返回预期结果。

  unitOfWorkRBMMock.Setup(s => s.ProtocolRepository.FindAll(It.IsAny<Expression<Func<PROTOCOL, bool>>>()))
                    .Returns(new List<PROTOCOL>());