C# 单元测试方法SqlCommand的扩展方法

C# 单元测试方法SqlCommand的扩展方法,c#,unit-testing,mocking,extension-methods,moq,C#,Unit Testing,Mocking,Extension Methods,Moq,我为SqlCommand创建了一个扩展方法,允许在执行命令之前进行一些额外的工作: public static SqlDataReader ExecuteMyReader( this SqlCommand sqlCommand ) { // Some calculations here return sqlCommand.ExecuteReader(); } 我的问题是,单元测试这种扩展方法的最佳方法是什么 我应该直接对数据库进行测试吗 或者我应该尝试创建一个模拟对象吗?如果

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

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

    return sqlCommand.ExecuteReader();
}
我的问题是,单元测试这种扩展方法的最佳方法是什么

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


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

如果您希望测试该命令是否确实更新了数据库,那么您应该编写一个。最好的测试方法是:

建立一个简单的数据库 执行测试 回滚数据库。 重复 这很好,因为这是你关心的。如果这是被嘲笑的,那就没有意义了,你会测试什么?你怎么知道它有效


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

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

建立一个简单的数据库 执行测试 回滚数据库。 重复 这很好,因为这是你关心的。如果这是被嘲笑的,那就没有意义了,你会测试什么?你怎么知道它有效


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

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

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

您说得对,您不能将该方法作为一个整体进行测试


我不知道你的计算的性质,但是如果它们可以被分解成另一个函数,那么这个函数可以进行单元测试。这将有助于确保计算(我假设它是实现的核心)正常工作

你说得对,你不能对整个方法进行测试


我不知道你的计算的性质,但是如果它们可以被分解成另一个函数,那么这个函数可以进行单元测试。这将有助于确保计算(我假设它是实现的核心)正常工作

你的考试不缺一步吗?在执行测试后,您看到数据库处于您想要的状态的部分?这将作为第二部分,即本测试的执行被包括在内。换句话说,安排、行动和断言。你的测试中没有遗漏一个步骤吗?在执行测试后,您看到数据库处于您想要的状态的部分?这将作为第二部分,即本测试的执行被包括在内。换句话说,安排、行动和断言。我可以用自己的方法进行计算,但我希望这个方法保持私有。有没有办法测试私有方法?@Simon-关于测试和测试覆盖率哲学,我建议看一看。我可以用自己的方法进行计算,但我更希望这个方法保持私有。有没有办法测试私有方法?@Simon-关于测试和测试覆盖率原理,我建议看一看。