gpt4 book ai didi

c# - 模拟 DbProviderFactory

转载 作者:行者123 更新时间:2023-11-30 12:18:44 24 4
gpt4 key购买 nike

我对单元测试比较陌生,对模拟完全陌生。我有一个数据库类,它包装了 DbProvider 工厂,我想在不连接到数据库的情况下为其创建单元测试。

我如何模拟 DbProvider 工厂,以便我可以将它传递给测试我的类?我还需要模拟 DbConnection、DbCommand 等吗?我的一小部分代码示例如下:

public Database(DbProviderFactory dbProviderFactory) {
Provider = dbProviderFactory;
}

public int UpdateRecords(string sql, CommandType type, params DbParameter[] parameters) {
int numberOfRecordsUpdated;

using (var connection = CreateConnection()) {

// Add ConnectionString
connection.ConnectionString = ConnectionString;

// Create command to hold the update statment
using (var command = CreateCommand()) {
try {
command.Connection = connection;
command.CommandType = type;
command.CommandText = sql;

// Add Parameters
foreach (var parameter in parameters) {
command.Parameters.Add(parameter);
}

// Open Connection
connection.Open();

// Execute SQL
numberOfRecordsUpdated = command.ExecuteNonQuery();
} finally {
command.Parameters.Clear();
}
}
}

return numberOfRecordsUpdated;
}

最佳答案

集成测试


如果您有兴趣(根据您的评论判断)测试从数据库中获取数据,您将执行集成测试

这些类型的测试与单元测试的不同之处在于它们运行的​​频率较低 - 最佳实践要求您在提交到源代码控制之前运行这些测试。

原因是它们速度较慢,而且您将访问一个真实的数据库(至少是一个测试数据库)。在每次运行时,您都需要删除数据库或不提交更改 - 您似乎知道自己在做什么,所以我将如何处理这件事留给您自己。

模拟


至于测试使用数据库的逻辑 - mockingdependency injection 是可行的方法。

我使用 Moq - 它可能是最容易使用的模拟框架。它实际上不仅适用于模拟对象(尽管名称如此)而且您可以生成 stubs and fakes与它。

伪模拟是这样的(使用数据库示例):

  • 设置模拟
  • 告诉它做什么(预期)- 例如一个保存的电话。
  • 使用您的 SUT(被测系统)
  • 验证模拟 - 在本例中,在您的 SUT 中调用了保存方法。

如需进一步帮助 - 查看 Google - 那里有一些用于单元测试和模拟的好资源。

关于c# - 模拟 DbProviderFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1432754/

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