如何对使用AutoMapper ProjectTo的代码进行单元测试?

时间:2015-12-27 19:02:51

标签: unit-testing automapper

我正在使用AutoMapper将实体框架实体映射到业务实体。业务逻辑类通过其构造函数将IMappingEngine作为依赖关系。然后它用于这样的方法:

public int DoSomething()
{
    var users = _dbContext.Users.ProjectTo<UserBLL>(null, _mappingEngine);

    // ...
    // some users' processing and business logic that should be tested
    // ...

    return result;
}

一切都很完美。问题是单元测试。我想通过ProjectTo实现我需要存根IMappingEngine.CreateMapExpression方法。但它似乎过于复杂。有没有更简单的解决方案?当然,可以通过在测试设置方法中配置映射,然后将Mapper.Engine传递给SUT来使用AutoMapper的实现,但它有点像集成测试,而不是单元。

1 个答案:

答案 0 :(得分:12)

ProjectTo只是一种生成Select LINQ投影的方法。你不会发出对Select的调用,因此你不会存在AutoMapper。

直接在单元测试中使用AutoMapper。我没有看到它与使用其他核心框架程序集或JSON.Net之类的东西有什么不同。

另一个问题是EF依赖关系。如果您希望此测试成为单元测试,则需要模拟DbContext。但是这条路线具有非常可疑的价值,被模拟的DbContext与真实路线有很多不同的运行时行为,所以我不会相信它。