如何编写最小起订量测试以设置 return 计数值的方法
How to write a moq test to setup a method to return a count value
在我的控制器操作中,每当添加新产品时,我都会在数据库中检查该产品编号是否不存在。这个检查的代码看起来像
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
}
我是最小起订量测试的新手,正在尝试编写一个单元测试来设置 GetAll 方法,该方法将 return 0。我写过类似的东西,但它似乎不起作用
var _productsService = new Mock<IProductsService>();
_productsService.Setup(m => m.GetAll(true).Count()).Returns(0);
有什么想法吗?谢谢
看看这个 post:
Expression references a method that does not belong to the mocked object
他基本上有同样的问题,你正在尝试模拟扩展方法Count()
这不是您使用 Moq 的方式——Count
很可能不是您的方法(它是 LINQ/other 第 3 方),您不要嘲笑它。您需要模拟的是 GetAll
方法,这是您的可模拟依赖项上的一种方法。您 "tell" GetAll
到 return 型号与参数匹配的产品,例如:
[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
永远不会 returns 产品的编号与 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
在我的控制器操作中,每当添加新产品时,我都会在数据库中检查该产品编号是否不存在。这个检查的代码看起来像
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
}
我是最小起订量测试的新手,正在尝试编写一个单元测试来设置 GetAll 方法,该方法将 return 0。我写过类似的东西,但它似乎不起作用
var _productsService = new Mock<IProductsService>();
_productsService.Setup(m => m.GetAll(true).Count()).Returns(0);
有什么想法吗?谢谢
看看这个 post: Expression references a method that does not belong to the mocked object
他基本上有同样的问题,你正在尝试模拟扩展方法Count()
这不是您使用 Moq 的方式——Count
很可能不是您的方法(它是 LINQ/other 第 3 方),您不要嘲笑它。您需要模拟的是 GetAll
方法,这是您的可模拟依赖项上的一种方法。您 "tell" GetAll
到 return 型号与参数匹配的产品,例如:
[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
永远不会 returns 产品的编号与 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