【问题标题】:How to unit test a method returning void?如何对返回 void 的方法进行单元测试?
【发布时间】:2014-05-10 09:44:11
【问题描述】:

我正在做单元测试(C#)并且我有一些返回 void 的方法。我想知道模拟这些方法的最佳方法是什么?

下面是一段代码:-

 public void DeleteProduct(int pId)
 {
         _productDal.DeleteProduct(pId);
 }

【问题讨论】:

  • 您不要“模拟”要测试的单元的方法。不过,您可能需要模拟它的一些依赖项。
  • Unit testing void methods? 的可能重复项

标签: c# unit-testing mocking void


【解决方案1】:

假设你可以模拟字段_productDal,你必须测试对应pId的记录/对象是否真的被删除了。

如果你将_productDal 注入到你的类中,就可以实现模拟,例如使用constructor injection

【讨论】:

  • 我会说像数据库一样模拟依赖项是非常糟糕的做法!
  • @Neel 为什么会这样?模拟是您仅出于测试目的而做的事情。如果您想测试此方法,然后查看方法的主体并得出结论,它所做的只是“转发”对_productDal 字段的调用,那么您所要做的就是测试_productDal 实际上正在接听电话。您可以验证您是否模拟该对象。
  • @Neel 嘲笑它只是为了无法测试的依赖关系,比如文件系统、数据库等......
【解决方案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));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多