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

如何用Mock测试API的Delete方法并添加假分类?

解决Mock测试Delete方法返回null的问题

你的测试代码漏了模拟根据ID查询分类的逻辑——Controller的Delete方法一般会先调用CategoriaRepository.GetById(id)检查分类是否存在,只有查到数据才会执行删除。没Mock这个查询的话,它默认返回null,自然会导致结果不符合预期。

按下面的步骤改测试代码就行:

1. 造个假的Categoria对象

先弄个用于测试的假分类,比如ID是1的:

var fakeCategoria = new Categoria { Id = 1, Nome = "测试分类" };

2. Mock GetById方法

让Mock的仓储在传入ID=1时,返回这个假分类:

MockUnit.Setup(m => m.CategoriaRepository.GetById(1)).Returns(fakeCategoria);

3. 完善Delete方法的Mock(可选)

如果你的Delete方法是有返回值的,可以指定返回结果;要是void方法,当前的Setup就够,但可以加个Verifiable(),方便后面验证这个方法确实被调用了:

MockUnit.Setup(m => m.CategoriaRepository.Delete(fakeCategoria)).Verifiable();

4. 调整断言逻辑

你测试方法名叫Delete_Categoria_Return_OkResult,但断言的是NotFoundResult,这明显矛盾了。如果是测删除存在的分类返回Ok,得把断言改成OkResult。

修改后的完整测试代码

[Fact]
public void Delete_Categoria_Return_OkResult()
{                       
    // Arrange  
    var fakeCategoria = new Categoria { Id = 1, Nome = "测试分类" };
    var controller = new CategoriasController(MockUnit.Object, mapper);

    // Mock查询:传ID=1就返回假分类
    MockUnit.Setup(m => m.CategoriaRepository.GetById(1)).Returns(fakeCategoria);
    // Mock删除:指定删除这个假分类(也可以用It.IsAny<Categoria>()匹配任意实例)
    MockUnit.Setup(m => m.CategoriaRepository.Delete(fakeCategoria)).Verifiable();

    // Act  
    var data = controller.Delete(1);

    // Assert  
    Assert.IsType<OkResult>(data.Result);
    // 验证Delete方法确实被调用了(可选,确保走到了删除步骤)
    MockUnit.Verify(m => m.CategoriaRepository.Delete(fakeCategoria), Times.Once);
}

额外场景测试

要是想测删除不存在的分类返回NotFound,那就不用Mock GetById(或者Mock它返回null),然后断言NotFoundResult:

[Fact]
public void Delete_Categoria_NotFound_When_Id_Does_Not_Exist()
{                       
    // Arrange  
    var controller = new CategoriasController(MockUnit.Object, mapper);
    // Mock查询:随便传什么ID都返回null
    MockUnit.Setup(m => m.CategoriaRepository.GetById(It.IsAny<int>())).Returns((Categoria)null);

    // Act  
    var data = controller.Delete(999);

    // Assert  
    Assert.IsType<NotFoundResult>(data.Result);
}

内容的提问来源于stack exchange,提问作者jadisson amorim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:01:23