如何进行单元测试。包括实体框架的急切加载

时间:2018-07-30 11:03:18

标签: c# entity-framework unit-testing mocking moq

我有一种方法,其目的是从DbSet中获取一个实体,该实体中已经急切地装入了相关数据(其逻辑中在.Includes中具有序列)。相关字段为virtual IEnumerable并被延迟加载。

现在,我想对该方法进行单元测试,以检查它是否加载了我需要的所有数据。我不知道如何解决它,我可以创建一个预期的实体并用数据填充它,但是仅模拟IDbSet(我使用的是Moq)是行不通的-如果我删除了所有经过测试的方法中的.Includes仍将返回所有相关实体,这不是它在实际数据库中的“实时”行为(实体将不会加载,并且该方法的合同将无法履行) 。

那么,我该如何模拟IDbSet,使其实际上在没有显式.Includes的情况下进行延迟加载?还是我做错了,还有其他方法可以测试这种方法?

1 个答案:

答案 0 :(得分:1)

测试诸如您的服务/存储库是否包括相关实体之类的东西将是集成测试场景,而不是单元测试。像这样的集成测试看起来像一个单元测试,并且是用NUnit / MSTest编写的,但是它将与单元测试分开,因此它不能与普通的单元测试套件一起运行,因为它们可能会很耗时。运行。

例如。

MyParentEntity entity = null;
using (var dbContext = new MyDbContext(connectionString))
{
    var myRepository = new MyRepository(dbContext);
    entity = myRepository.GetEntityById(1);
} // leave the scope of the DbContext.

// example asserts...
Assert.IsNotNull(entity.Relative, "Relative was not eager loaded."); // Null or EF Exception if proxy attempts to lazy-load.
Assert.IsTrue(entity.Children.Count == 3, "Children were not eager loaded.");

这意味着一个已知的数据状态,因此集成测试通常使用内存中的数据库,这些数据库可以快速地填充,或者被设置为在测试夹具设置中针对已知数据状态恢复数据库备份。