【问题标题】:How to mock Automapper ProjectTo<> method in Unit Tests?如何在单元测试中模拟 Automapper ProjectTo<> 方法?
【发布时间】:2021-01-27 17:35:25
【问题描述】:

我正在使用ProjectTo&lt;T&gt; 方法从数据库中获取数据。

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

在单元测试中我想模拟这个方法来返回一个特定的集合。

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

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

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

_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);

【问题讨论】:

  • 为什么不使用您将在设置中测试的特定表达式?
  • 在原始方法使用中,我没有传递任何表达式:names = _mapper.ProjectTo(query).ToList();但是在测试中我需要通过一个,否则我会收到这个错误。 stackoverflow.com/questions/12413583/…
  • @MiBuena 为什么要模拟 AutoMapper?为什么不使用配置的映射?
  • @Peter Csala 因为我正在编写单元测试。单元测试应该模拟所有的外部依赖。
  • @PeterCsala,不要离开他们。其他人可能会从讨论中受益。附言它可能是组件测试——但我仍然更喜欢保持书中描述的 UT 的纯跟踪。我想我们可以同意在这种情况下不同意。

标签: c# unit-testing automapper moq


【解决方案1】:

要在没有提供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 =&gt; x.Length == 0 表示一个空数组,当没有params 被传递时,框架会实例化它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2015-10-21
    • 2021-04-02
    相关资源
    最近更新 更多