You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MSTest在C#中模拟过滤数据返回空列表问题求助

解决MSTest模拟EF Core查询时Include+Where返回空列表的问题

以下是几个排查和解决的方向:

  • 检查测试数据是否完全匹配过滤条件
    你的过滤逻辑有三个核心条件,必须确保测试数据全部满足:

    1. sd.StudentId == id:测试用例里传的studentId是1,所以_studentDataDE或_studentDataFR的StudentId得设为1。
    2. sd.ApplicableEducationalLegislationBasis.IsActive == true:必须给测试数据里的ApplicableEducationalLegislationBasis实例化对象(不能是null),并且把IsActive设为true。如果这个关联对象是null,理论上会抛空引用异常,你没报错说明对象存在,但大概率IsActive是false,导致被过滤掉。
    3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:05:38