使用MSTest在C#中模拟过滤数据返回空列表问题求助
解决MSTest模拟EF Core查询时Include+Where返回空列表的问题
以下是几个排查和解决的方向:
检查测试数据是否完全匹配过滤条件
你的过滤逻辑有三个核心条件,必须确保测试数据全部满足:sd.StudentId == id:测试用例里传的studentId是1,所以_studentDataDE或_studentDataFR的StudentId得设为1。sd.ApplicableEducationalLegislationBasis.IsActive == true:必须给测试数据里的ApplicableEducationalLegislationBasis实例化对象(不能是null),并且把IsActive设为true。如果这个关联对象是null,理论上会抛空引用异常,你没报错说明对象存在,但大概率IsActive是false,导致被过滤掉。sd.AssessingSchoolAuthorityId != userAuthority.Code:确认测试数据的AssessingSchoolAuthorityId和GetNewRequest方法里的userAuthority.Code值不相等。比如如果userAuthority.Code是1,测试数据里这个字段就得设成其他值。
参考正确的测试数据初始化示例:
private void _InitializeTestDataBeforeTests() { _studentDataDE = new StudentData { StudentId = 1, // 匹配测试用例的studentId AssessingSchoolAuthorityId = 2, // 假设userAuthority.Code为1,这里不等于1 ApplicableEducationalLegislationBasis = new EducationalLegislationBasis { IsActive = true // 满足IsActive条件 } }; _studentDataFR = new StudentData { StudentId = 2, AssessingSchoolAuthorityId = 3, ApplicableEducationalLegislationBasis = new EducationalLegislationBasis { IsActive = false // 不满足条件,会被过滤 } }; }换用EF Core内存数据库代替Mock
直接Mock DbContext有时候会因为Linq查询的IQueryable异步支持问题,导致结果不符合预期。改用EF Core的内存数据库,能更真实模拟数据库查询行为:[TestInitialize] public void Setup() { _InitializeTestDataBeforeTests(); // 配置内存数据库 var options = new DbContextOptionsBuilder<DatabaseContext>() .UseInMemoryDatabase(databaseName: "TestStudentDb") .Options; // 创建真实的上下文实例,添加测试数据 var dbContext = new DatabaseContext(options); dbContext.StudentData.AddRange(_studentDataDE, _studentDataFR); dbContext.SaveChanges(); // 用真实上下文初始化服务 _newRequestService = new NewRequestService(dbContext); }这种方式不需要Mock,能完美支持Include、Where以及异步查询,避免Mock带来的各种兼容性问题。
验证过滤条件中的变量值
调试时确认userAuthority.Code的实际值,以及测试数据的AssessingSchoolAuthorityId是否真的不等于它。比如在GetNewRequest方法里临时加日志输出,或者在测试中打断点查看这些变量的值,避免因为变量值不符合预期导致过滤后无数据。确认Include的关联数据状态
Include本身不会过滤结果,但如果关联数据为null,访问它的IsActive属性会抛异常。你没报错说明关联对象存在,但一定要确保IsActive是true,否则会被Where条件过滤掉。
内容的提问来源于stack exchange,提问作者Ntavass
相关产品推荐
相关产品推荐

