【问题标题】:Method for unit testing an extension method for SqlCommand对SqlCommand的扩展方法进行单元测试的方法
【发布时间】:2010-04-19 13:31:25
【问题描述】:

我为 SqlCommand 创建了一个扩展方法,它允许在执行命令之前进行一些额外的工作:

public static SqlDataReader ExecuteMyReader( this SqlCommand sqlCommand )
{
    // Some calculations here

    return sqlCommand.ExecuteReader();
}

我的问题是对这种扩展方法进行单元测试的最佳方法是什么?

我应该直接针对数据库进行测试吗?

或者我应该尝试创建一个模拟对象吗?如果是这种情况,我已经尝试通过 Moq 执行此操作,但由于 SqlCommand 是一个密封类,我似乎无法模拟它。

【问题讨论】:

    标签: c# unit-testing mocking extension-methods moq


    【解决方案1】:

    您能否将计算提取到他们自己的方法中并单独测试它们?正如您所发现的,在这种粒度级别为函数编写单元测试既困难又没有回报。

    【讨论】:

    • 我可以把计算拉出来,所以它在它自己的方法中但是我宁愿这个方法保持私有有没有测试私有方法的方法?
    • 至于测试和测试覆盖原理,我推荐看看this answer
    【解决方案2】:

    如果您想测试该命令是否确实更新了数据库,您将编写一个integration test。最好的测试方法是:

    • 建立一个简单的数据库
    • 执行测试
    • 回滚数据库。
    • 重复

    这很好,因为这就是您所关心的。如果这要被嘲笑(没有意义),你会测试什么?你怎么知道它有效?

    您希望模拟的唯一一次是使用您的扩展方法的代码。但是,当您希望测试扩展方法时,只有一种方法,那就是实际访问数据库。

    【讨论】:

    • 你的测试是不是少了一个步骤?测试执行后,您看到数据库处于您想要的状态的部分?
    • 这将包含在第二部分,即测试的执行中。换句话说,Arrange、Act 和 Assert。
    【解决方案3】:

    你说你不能作为一个整体测试方法是对的。

    我不知道您计算的性质,但如果可以将它们拆分为另一个函数,则可以对该函数进行单元测试。这将有助于确保计算(我认为是您的实现的核心)正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多