2010-04-19 59 views
1

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

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

    return sqlCommand.ExecuteReader(); 
} 

我的问题是什么是单元测试的最好方式这扩展方法?

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

或者我应该尝试创建一个模拟对象吗?如果是这种情况,我尝试通过Moq来做这件事,但由于SqlCommand是一个封闭的类,我似乎无法嘲笑它。

回答

2

你可以将计算拉出到他们自己的方法并单独测试它们吗?正如你已经发现的那样,在这个粒度级别编写函数的单元测试是很困难和没有根据的。

+0

这也是一个不错的选择。 – Finglas 2010-04-19 13:37:25

+0

我可以把计算拉出来,所以它是在它自己的方法中,但是我宁愿这个方法保持私有,是否有测试私有方法的方法? – lancscoder 2010-04-19 13:40:46

+0

@Simon - 查看http://stackoverflow.com/questions/51950/how-do-i-allow-assembly-unit-testing-one-to-access-internal-properties-of-anoth – Finglas 2010-04-19 13:44:13

2

如果你想测试命令实际上是否更新数据库,你会写integration test。然后测试这个最好的方法是:

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

这是好的,因为这是你关心的内容。如果这是嘲弄(没有意义),你会测试什么?你怎么知道它的工作原理?

您希望嘲笑的唯一时间是使用您的扩展方法的代码。但是,当你想测试一个扩展方法时,只有一种方法,那就是实际命中数据库。

+0

您的测试中没有缺少一步吗?在测试执行后你看到数据库处于你想要的状态的部分? – user151841 2010-04-19 13:36:52

+0

这将作为第二部分,执行此测试。换句话说,Arrange,Act和Assert。 – Finglas 2010-04-19 13:38:39

0

你说得不对整个方法进行测试是正确的。

我不知道你的计算的性质,但如果它们可以分解到另一个函数,那么该函数可以进行单元测试。这将有助于确保计算,我认为这是您的实施的肉,正常工作。