如何在单元测试中模拟 Automapper ProjectTo<> 方法?

How to mock Automapper ProjectTo<> method in Unit Tests?

我正在使用 ProjectTo<T> 方法从数据库中获取数据。

names = _mapper.ProjectTo<ItemNameDto>(query).ToList();

在单元测试中,我想将此方法模拟到 return 特定集合。

根据 this 问题的第二个答案 - 我发现我需要将所有参数传递给设置。

当我将 null 传递给第二个参数时 - 设置正常,但是当我将 null 传递给第三个参数时 - 设置没有 return 我想要的集合。

在这种特殊情况下,我应该将什么值传递给 Expression 参数?我真的不想用 It.IsAny<> 保留它,因为它对我来说太宽泛了。我想编写一个完全反映我的用例的设置。

_mapperMock
    .Setup(c => c.ProjectTo(
        It.Is<IQueryable<Item>>(x => x.HaveTheSameElements(filteredItems)),
        It.IsAny<object>(),
        It.IsAny<Expression<Func<ItemNameDto, object>>[]>()))
    .Returns(filteredItemNameDtos.AsQueryable());

这是我要设置的方法签名。

IQueryable<TDestination> ProjectTo<TDestination>(IQueryable source, object parameters = null, params Expression<Func<TDestination, object>>[] membersToExpand);

要在没有提供 membersToExpand 的情况下模拟对 ProjectTo 的调用,您应该使用 It.Is:

_mapperMock
    .Setup(c => c.ProjectTo(
        It.Is<IQueryable<Item>>(x => x.HaveTheSameElements(filteredItems)),
        It.IsAny<object>(),
        It.Is<Expression<Func<ItemNameDto, object>>[]>(x => x.Length == 0)))
    .Returns(filteredItemNameDtos.AsQueryable());

x => x.Length == 0表示一个空数组,框架在没有传递params时实例化。