UnitTest-测试来自mock的方法时出现问题
本文关键字:问题 方法 测试 mock UnitTest- | 更新日期: 2023-09-27 18:21:58
我有一个使用接口的类,它有一个void方法,看起来像这个switch现在是完全可用的方法:
public void SellGivenQuantityOfProduct(Product product, int quantity)
{
product.StockQuantity = product.StockQuantity - quantity;
}
但是以TDD的方式工作,我开始像下面这样做,但在我的测试方法中从未发生过计算
[TestMethod]
public void Can_Sell_Given_Quantity_Of_Single_Products_Stock_Quantity()
{
var mock = new Mock<ISellBuyPipeLine>();
mock.Setup(o => o.Products).Returns(new Product[]
{
new Product() {ArticleNr = 87, StockQuantity = 10}
});
var product = mock.Object.Products.First();
var choosenProductToSell = new SellBuyProduct() {Product = product, Quantity = 5};
mock.Object.SellGivenQuantityOfProduct(product, choosenProductToSell.Quantity);
/*var test = new SellBuyPipeLine();
test.SellGivenQuantityOfProduct(product, choosenProductToSell.Quantity);*/
int expectedSellValue = product.StockQuantity;
Assert.AreEqual(5, expectedSellValue);
}
如果我使用未注释的行,并直接命中持有我的方法的类,它会起作用!但我想用模拟。
我做错了什么?
我用错方法了吗?
如果要测试实现,请测试实现。mock对象的方法不包含实现。
您可能想要模拟Product
,使测试方法看起来像这样:
public void Can_Sell_Given_Quantity_Of_Single_Products_Stock_Quantity()
{
// Arrange
int stockQuantity = 10;
int quantityToSell = 4;
int newQuantity = 6;
var productMock = new Mock<Product>(MockBehavior.Strict);
productMock.SetupGet(p => p.StockQuantity).Returns(stockQuantity);
productMock.SetupSet(p => p.StockQuantity = newQuantity);
var classUnderTest = new SellBuyPipeLine();
// Act
test.SellGivenQuantityOfProduct(product, quantityToSell);
// Assert
productMock.VerifySet(p => p.StockQuantity, Times.Once());
}
您可以不使用,因为Product不包含任何逻辑,在这种情况下,只需实例化一个new Product
并断言其StockQuantity
等于newQuantity
;
除非Product
类包含实际的业务逻辑,否则不要嘲笑它。我建议你在写测试的时候尽量装傻。
[TestMethod]
public void Can_Sell_Given_Quantity_Of_Single_Products_Stock_Quantity()
{
var product = new Product { ArticleNr = 87, StockQuantity = 10 };
var pipeline = new SellBuyPipeLine();
pipeline.SellGivenQuantityOfProduct(product, 5);
Assert.AreEqual(5, product.StockQuantity);
}
愚蠢的(非常简单的)测试会导致愚蠢的简单生产代码,而这正是您想要的。
尽可能避免对调用的mock和断言采取严格的行为,因为这些行为会使测试变得脆弱。