Rhino模拟访问数据库

时间:2013-04-09 21:16:11

标签: c# unit-testing nunit rhino-mocks

如果之前已经提出这个问题,请原谅。 我正处于一个阶段,寻找的例子是返回太多令我困惑的结果。

我是犀牛嘲笑的新手,我知道有很多例子,但界面 - 虚拟推荐让我感到困惑。

如果我的类工作正常(但我不得不对每行代码进行单元测试)我是否必须调整我的代码以满足单元测试?或者应该是相反的方式?

为了达到目的,我有以下课程,我想嘲笑它。

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 个答案:

答案 0 :(得分:1)

总有某些部分无法使用像rhino这样的框架进行单元测试,您可以使用类似TypeMock Isolator的框架对其进行测试,但这个部分不是免费的。

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

我有一些软件项目包括单一和集成自动测试,我正在运行它们并取得了巨大的成功。

答案 1 :(得分: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());