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,则必须测试

我正在做单元测试(C#),我有一些方法返回void。我想知道模仿这些方法的最好方法是什么

下面是一段代码:-

 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模拟它只是为了不稳定的依赖关系,如文件系统、数据库等。。。