我有一种方法,其目的是从DbSet
中获取一个实体,该实体中已经急切地装入了相关数据(其逻辑中在.Includes
中具有序列)。相关字段为virtual IEnumerable
并被延迟加载。
现在,我想对该方法进行单元测试,以检查它是否加载了我需要的所有数据。我不知道如何解决它,我可以创建一个预期的实体并用数据填充它,但是仅模拟IDbSet
(我使用的是Moq)是行不通的-如果我删除了所有经过测试的方法中的.Includes
仍将返回所有相关实体,这不是它在实际数据库中的“实时”行为(实体将不会加载,并且该方法的合同将无法履行) 。
那么,我该如何模拟IDbSet
,使其实际上在没有显式.Includes
的情况下进行延迟加载?还是我做错了,还有其他方法可以测试这种方法?
答案 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.");
这意味着一个已知的数据状态,因此集成测试通常使用内存中的数据库,这些数据库可以快速地填充,或者被设置为在测试夹具设置中针对已知数据状态恢复数据库备份。