You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

单元测试断言异常失败:删除供应商异步方法测试问题咨询

排查删除操作单元测试断言失败的关键点

嘿,我仔细看了你的测试代码,发现几个很可能导致断言失败的问题,咱们一步步梳理:

1. 你的测试缺少断言步骤

这是最直接的问题——你定义了expectedSuppliers,但在执行删除操作后完全没验证实际数据库状态是否符合预期。赶紧补上这部分:

// Act
await db.DeleteSupplierAsync(recId);
await db.SaveChangesAsync(); // 划重点:如果DeleteSupplierAsync内部没调用SaveChanges,这一步必须加!

// Assert
var actualSuppliers = await db.Suppliers.ToListAsync();
// 先验证数量是否符合预期
Assert.Equal(expectedSuppliers.Count, actualSuppliers.Count);
// 再验证目标供应商确实被删掉了
Assert.DoesNotContain(actualSuppliers, s => s.ID == recId);

2. 检查DeleteSupplierAsync的实现逻辑

这是踩坑重灾区,得确认这个方法内部到底做了什么:

  • 是不是真的找到ID=123的供应商了?有没有可能用了软删除(比如标记IsDeleted=true)而不是物理删除?如果是软删除,你的查询得过滤掉已删除的记录才能匹配预期。
  • 方法内部有没有调用SaveChangesAsync()?如果没有,删除操作只是在内存上下文里标记了状态,根本没写到数据库里,断言肯定失败。
  • 可以先断言删除操作的返回结果(如果方法有返回值的话),比如:
    var deleteSuccess = await db.DeleteSupplierAsync(recId);
    Assert.True(deleteSuccess, "删除操作未找到目标供应商或执行失败");
    

3. 确认种子数据里真的有ID=123的供应商

你用SulferFireDbContext.GetSeedingSuppliers()生成种子数据,但得确保这个方法返回的集合里确实存在ID=123的供应商。如果种子数据里根本没这个ID,删除操作等于没执行,后续断言数量减少1肯定失败。可以在Arrange阶段加个小验证:

Assert.Contains(seedSuppliers, s => s.ID == recId, "种子数据里找不到ID为123的供应商,没法测试删除");

4. 注意DbContext的本地缓存问题

如果DeleteSupplierAsync是用SQL语句直接删除(比如ExecuteSqlRawAsync),而不是通过EF的实体跟踪(Find+Remove),那么当前DbContext的本地缓存不会自动更新。这时候你查询db.Suppliers拿到的还是旧数据,断言自然失败。解决办法:

  • 要么调用db.ChangeTracker.Clear()清空本地缓存,再查询数据库
  • 要么直接用SQL查询验证删除结果,绕过本地缓存

5. 确保测试数据库是隔离的

检查Utilities.TestingDbContextOptions()是不是配置了每次测试都全新初始化的数据库(比如内存数据库、每次重建的SQLite库)。如果多个测试共享同一个数据库,之前的测试数据可能干扰这次测试,导致断言失败。


内容的提问来源于stack exchange,提问作者Noémie Harvey

火山引擎 最新活动