我正在进行单元测试(C#),我有一些返回void的方法。我想知道模拟这些方法的最佳方法是什么?
以下是一段代码: -
public void DeleteProduct(int pId)
{
_productDal.DeleteProduct(pId);
}
答案 0 :(得分:2)
假设您可以模拟字段_productDal
,则必须测试是否实际删除了具有相应pId
的记录/对象。
如果你在课堂上注入_productDal
,就可以实现{{1}}的模拟,例如使用constructor injection。
答案 1 :(得分:2)
您可以测试的是使用正确的参数调用ProductDAL.DeleteProduct。 这可以通过使用依赖注入和模拟来实现!
使用Moq作为模拟框架的示例:
public interface IProductDal
{
void DeleteProduct(int id);
}
public class MyService
{
private IProductDal _productDal;
public MyService(IProductDal productDal)
{
if (productDal == null) { throw new ArgumentNullException("productDal"); }
_productDal = productDal;
}
public void DeleteProduct(int id)
{
_productDal.DeleteProduct(id);
}
}
单元测试
[TestMethod]
public void DeleteProduct_ValidProductId_DeletedProductInDAL()
{
var productId = 35;
//arrange
var mockProductDal = new Mock<IProductDal>();
var sut = new MyService(mockProductDal.Object);
//act
sut.DeleteProduct(productId);
//assert
//verify that product dal was called with the correct parameter
mockProductDal.Verify(i => i.DeleteProduct(productId));
}