2013-04-09 91 views
0

请原谅,如果这个问题之前已被问到。 我正处于寻找示例的阶段正在返回太多令我困惑的结果。犀牛嘲笑访问数据库

我是新来的犀牛嘲笑,我知道有大量的例子,但界面 - 虚拟推荐有点混淆我。

如果我的类可以正常工作(但我有义务单元测试每行代码),我是否必须修改我的代码以满足单元测试?或者它应该是另一种方式?

为了达到这一点,我有以下班,我想嘲笑它。

public class DatabaseOperation 
{ 
    public IList<T> GetRecords<T>(string connectionString, string storedProcedureName) 
    { 
     using (var connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      using (var command = connection.CreateCommand()) 
      { 
       command.CommandType = CommandType.StoredProcedure; 
       command.CommandText = storedProcedureName; 
       var reader = command.ExecuteReader(); 
       var fillSelection = new FillSelection<T>(); 
       return fillSelection.GetSelection(reader); 
      } 
     } 
    } 
} 

我该怎么做?

+2

你,你停止单元测试的地方画一条线。就我个人而言,我倾向于将上面的标准样板代码视为不需要测试。如果您必须'测试'它,您需要模拟SQLConnection并将其注入到此代码中,以便测试代码与它的交互方式。但我认为这会浪费时间。更重要的问题是你如何知道SP应该做什么。 – 2013-04-09 21:22:04

+0

问题是代码质量控制代码被监控,并且没有技术用户,这个工具的结果是唯一的参考。如果我不单元测试所有的代码,那么质量指标将呈红色。所以我必须测试它。 (这是许多其他与数据库交互的代码的一部分,所以我希望能为此解决方案,并试图找出其余的部分。 – Maro 2013-04-09 21:26:28

+1

然后在代码中注入SqlConnection模拟代码。如果我没有正确的记忆,SqlConnection上有一个IDbConnection接口,这可能是你应该基于的模拟on – 2013-04-09 22:17:23

回答

1

如果你想测试方法本身,你应该添加一个依赖关系。这意味着使用IDbConnection而不是SqlConnection,并将其用作参数而不是连接字符串。 然后你可以模拟输入参数和测试方法的行为。例如,如果调用IDbConnction.Open方法,或者所有方法都按正确顺序调用。

你的方法应该具有以下特征:

public IList<T> GetRecords<T>(IDbConnection connection, string storedProcedureName) 

在您的测试就可以使用下面的语句:

IDbConnection connectionMock = MockRepository.GenerateMock<IDateTimeProvider>(IDbConnection); 

// initialize mock object and your class here 

yourClassInstance.GetRecords(connectionMock, yourProcedureName); 

dateTimeProviderMock.AssertWasCalled(connection => connection.Open()); 
1

总有某些部分不能用像犀牛这样的框架进行真正的单元测试,你可以用像TypeMock Isolator这样的框架来测试它,但这不是免费的。

如果你希望你可以测试这个代码,但这将是一个集成测试,而不是一个单一的代码,这意味着你需要一个带有假数据的真实数据库来通过这个测试。这会给你100%的代码覆盖率,但你必须意识到,它不仅可以被这部分代码破坏,而且还可以与集成相关的问题破坏。

我有几个软件项目,包括单一和集成自动测试,我正在运行所有这些项目都取得了巨大成功。

+0

只需添加这篇文章,你应该看看SpecFlow,你可以编写用户验收测试,这些测试应该进行集成测试。 – 2013-04-09 22:20:53