gpt4 book ai didi

c# - 如何编写最小起订量测试以设置返回计数值的方法

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:58 26 4
gpt4 key购买 nike

在我的 Controller 操作中,每当添加新产品时,我都会在数据库中检查该产品编号是否不存在。此检查的代码如下所示

 public ActionResult Index(ProductModel model)
{
var productCount = _productsService.GetAll(true).Count(x => x.ProductNumber == model.ProductNumber);

if (productCount > 0)
ModelState.AddModelError("ProductNumber", Product already present in the system!");

// more processing
}

我是 MOQ 测试的新手,正在尝试编写一个单元测试来设置将返回 0 的 GetAll 方法。我写了类似的东西,但它似乎不起作用

 var _productsService = new Mock<IProductsService>();
_productsService.Setup(m => m.GetAll(true).Count()).Returns(0);

有什么想法吗?谢谢

最佳答案

这不是您使用 Moq 的方式——Count 很可能不是您的方法(它是 LINQ/其他第 3 方),您不要 mock 它。您需要模拟的是 GetAll 方法,这是您的可模拟依赖项的方法。您“告诉”GetAll 返回模型与参数匹配的产品,如下所示:

[Test]
public void Index_ReportsModelError_WhenProductAlreadyExists()
{
const int ExistingProductNumber = 10;
var _productsService = new Mock<IProductsService>();
var existingProduct = new Product { ProductNumber = ExistingProductNumber };
_productsService.Setup(m => m.GetAll(true)).Returns(new [] { existingProduct });

controller.Index(new ProductModel { ProductNumber = ExistingProductNumber });

// Assert
}

修复现有测试就像确保 GetAll 永远不会返回与 Index 参数中的产品编号相同的产品一样简单:

const int ExistingProductNumber = 10;
const int NewProductNumber = 20;
var _productsService = new Mock<IProductsService>();
var existingProduct = new Product { ProductNumber = ExistingProductNumber };
_productsService.Setup(m => m.GetAll(true)).Returns(new [] { existingProduct });

controller.Index(new ProductModel { ProductNumber = NewProductNumber });

// Assert

关于c# - 如何编写最小起订量测试以设置返回计数值的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29389274/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com