gpt4 book ai didi

c# - 单元测试难题 : OleDbCommand

转载 作者:搜寻专家 更新时间:2023-10-30 23:40:27 25 4
gpt4 key购买 nike

我尝试对其进行单元测试的类之一使用了 OleDbConnection 对象。该对象负责根据传递的 SQL 字符串返回保存在 MS Access 文件中的信息。代码是:

public void getInformation(DateTime start, DateTime finish)
{
string getInfo = "";
string query = "//Query for MS Access goes here";
transactions = addTransactions(query, conn);
}

其中 addTransactions 是一个私有(private)方法,它返回从数据库中检索到的列表:

private List<string> addTransactions(string query, OleDbConnection conn)
{
List<string> returnedData = new List<string>();
OleDbCommand cmd = new OleDbCommand(query, conn);
try
{
if (conn.State == ConnectionState.Closed) conn.Open();
OleDbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
if (!reader.IsDBNull(0))
}
returnedData.Add(reader.GetString(0));
}
catch (Exception ex)
{
Console.WriteLine("OLEB: {0}", ex.Message);
}
conn.Close();
return returnedData;
}

现在我已经通过查看此方法知道很难进行单元测试,因为公共(public) getInformation() 方法是无效的。我能做的是测试返回的数据中是否包含某些内容。我的问题是如何编写涉及 OleDbConnection 的单元测试?

我想到的仅有的 2 个可能的解决方案涉及创建一个临时访问文件(不理想,因为我们现在不在单元测试的范围内,而且在其他开发人员的机器上运行测试时可能会失败)或为 OleDbConnection 创建一个包装器并在单元测试中使用它(这听起来是最好的方法,但我不知道从哪里开始)。

最佳答案

or creating a wrapper for OleDbConnection and using that in the unit test

这就是我的方法。不能直接模拟/测试的对象通常代表其自身的依赖关系。并且应该提供所有依赖项而不是在内部实例化。

包装器可以是提供相同功能的简单传递。让它由一个接口(interface)和该接口(interface)的代码驱动,这样您就可以为该接口(interface)提供模拟以进行单元测试。 (作为额外的好处,即使被测试的方法返回 void,您的 mock 也会让您观察到一些东西。因此您不必深入研究您正在测试的系统,只需观察在模拟中调用了什么。)

从您模拟的聚合根开始,您需要包装 OleDbConnection。一个简单的入门示例可能如下所示:

public interface IDbConnection
{
IDbCommand CreateCommand();
// other methods
}

public class MyOleDbConnection : IDbConnection
{
private OleDbConnection conn;

public MyOleDbConnection()
{
// initialize "conn" here
}

public IDbCommand CreateCommand()
{
return conn.CreateCommand();
}

// other pass-thru methods
}

本质上,它只是底层对象公开的相同功能的直通包装器。这样做的好处是this 对象实际上并不需要 进行单元测试,因为它不包含任何有意义的可测试逻辑。 (当然,达到 100% 会很好,但投资返回率在这个类(class)中是不存在的。)

如您所见,这还涉及以类似方式为 OleDbCommand 创建包装器。同样,只是传递方法。

一旦您的依赖项被包装并可模拟,您将更改您的类以使用包装器。例如,而不是这个:

OleDbCommand cmd = new OleDbCommand(query, conn);

它在内部持有对依赖项的引用,您可以这样做:

IDbCommand cmd = conn.CreateCommand();

它要求依赖项提供对某物的引用。这将维护依赖关系的责任放在了依赖关系本身上,而不是在您要测试的此类中。 (并且,在这样做的过程中,试图保持对依赖的自由。)

一旦依赖项从您的类中完全移除,您就可以自由地模拟和测试您喜欢的一切。

关于c# - 单元测试难题 : OleDbCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35551870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com