C# 如何对返回void的方法进行单元测试?
我正在做单元测试(C#),我有一些方法返回void。我想知道模仿这些方法的最好方法是什么 下面是一段代码:-C# 如何对返回void的方法进行单元测试?,c#,unit-testing,mocking,void,C#,Unit Testing,Mocking,Void,我正在做单元测试(C#),我有一些方法返回void。我想知道模仿这些方法的最好方法是什么 下面是一段代码:- public void DeleteProduct(int pId) { _productDal.DeleteProduct(pId); } 假设可以模拟字段\u productDal,则必须测试具有相应pId的记录/对象是否实际被删除 如果将\u productDal注入类中,可以实现对它的模拟,例如使用。假设可以模拟字段\u productDal,则必须测试
public void DeleteProduct(int pId)
{
_productDal.DeleteProduct(pId);
}
假设可以模拟字段
\u productDal
,则必须测试具有相应pId
的记录/对象是否实际被删除
如果将
\u productDal
注入类中,可以实现对它的模拟,例如使用。假设可以模拟字段\u productDal
,则必须测试是否实际删除了具有相应pId
的记录/对象
如果将
\u productDal
注入类中,可以实现对它的模拟,例如使用。可以测试的是,productDal.DeleteProduct是使用正确的参数调用的。
这可以通过使用依赖项注入和模拟来实现
使用模拟框架的示例:
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));
}
[TestMethod]
public void DeleteProduct\u ValidProductId\u deleteProductIndal()
{
var-productId=35;
//安排
var mockProductDal=new Mock();
var sut=newmyservice(mockProductDal.Object);
//表演
sut.DeleteProduct(productId);
//断言
//验证是否使用正确的参数调用了产品dal
mockProductDal.Verify(i=>i.DeleteProduct(productId));
}
您可以测试的是使用正确的参数调用ProductDAL.DeleteProduct。
这可以通过使用依赖项注入和模拟来实现
使用模拟框架的示例:
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));
}
[TestMethod]
public void DeleteProduct\u ValidProductId\u deleteProductIndal()
{
var-productId=35;
//安排
var mockProductDal=new Mock();
var sut=newmyservice(mockProductDal.Object);
//表演
sut.DeleteProduct(productId);
//断言
//验证是否使用正确的参数调用了产品dal
mockProductDal.Verify(i=>i.DeleteProduct(productId));
}
您不需要“模拟”要测试的单元的方法。不过,您可能需要模拟它的某些依赖项。可能的重复项不会“模拟”要测试的单元的方法。您可能需要模拟它的一些依赖关系。我想说,像数据库一样模拟依赖关系是非常糟糕的做法@尼尔,为什么?模拟只是为了测试目的而做的事情。如果你想测试这个方法,那么看看这个方法的主体并得出结论,它所做的一切就是“转发”对\u productDal
字段的调用,那么你所要测试的就是\u productDal
实际上正在接收调用。如果你模拟那个对象,你可以验证它。@Neel模拟它只是为了不稳定的依赖关系,如文件系统、数据库等。我想说,像数据库一样模拟依赖关系是非常糟糕的做法@尼尔,为什么?模拟只是为了测试目的而做的事情。如果你想测试这个方法,那么看看这个方法的主体并得出结论,它所做的一切就是“转发”对\u productDal
字段的调用,那么你所要测试的就是\u productDal
实际上正在接收调用。您可以验证是否模拟该对象。@Neel模拟它只是为了不稳定的依赖关系,如文件系统、数据库等。。。