0

如果以前有人问过这个问题,请原谅。我处于搜索例如返回太多结果的阶段,这让我感到困惑。

我是 Rhino 模拟的新手,我知道有很多示例,但界面 - 虚拟推荐让我感到困惑。

如果我的课程运行良好(但我必须对每一行代码进行单元测试),我是否必须调整我的代码以满足单元测试的要求?还是应该反过来?

说到重点,我有以下课程,我想模拟它。

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);
            }
        }
    }
}

我怎样才能做到这一点?

4

2 回答 2

1

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

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

我有几个软件项目同时进行了单一和集成自动测试,并且我在运行所有这些项目时都取得了巨大的成功。

于 2013-04-09T21:40:44.320 回答
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());
于 2013-04-11T07:43:44.893 回答