如何用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
相关产品推荐
相关产品推荐

