如果之前已经提出这个问题,请原谅。 我正处于一个阶段,寻找的例子是返回太多令我困惑的结果。
我是犀牛嘲笑的新手,我知道有很多例子,但界面 - 虚拟推荐让我感到困惑。
如果我的类工作正常(但我不得不对每行代码进行单元测试)我是否必须调整我的代码以满足单元测试?或者应该是相反的方式?
为了达到目的,我有以下课程,我想嘲笑它。
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);
}
}
}
}
我该怎么做?
答案 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());