单元测试 DbProviderFactory 的最佳方式
Best way to unit test DbProviderFactory
我正在尝试为我们拥有的旧代码创建单元测试 (NUnit)。
我们使用 DbProviderFactory 检查数据库中是否存在 table,然后再对 table 执行任何操作。
我知道这看起来更像是集成测试,但不管你怎么称呼它,我都需要对其进行测试。我更愿意使用自包含的东西而不依赖于数据库。
我尝试使用 excel 作为我的数据源但是 select table 在 excel 它应该在 table 名称之后有 $在我的案例中不起作用,因为我不想修改我的代码以适应单元测试。
如何对以下代码进行单元测试?
static bool TableDoesNotExist(string tableName, string connectionString, string providerName = "System.Data.OleDb")
{
try
{
DbProviderFactory providerFactory = DbProviderFactories.GetFactory(providerName);
using (DbConnection conn = providerFactory.CreateConnection())
{
conn.ConnectionString = connectionString;
conn.Open();
DbCommand cmd = providerFactory.CreateCommand();
cmd.Connection = conn;
string tblQuery = "";
if (providerName == "System.Data.Odbc")
tblQuery = string.Format("SELECT COUNT(*) FROM SYSTABLE WHERE TABLE_NAME = '{0}'", tableName);
else
tblQuery = string.Format("SELECT COUNT(*) FROM [INFORMATION_SCHEMA.TABLES$] WHERE TABLE_NAME = '{0}'", tableName);
cmd.CommandText = tblQuery;
Console.WriteLine(cmd.CommandText);
DbDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
if (dt.Rows.Count == 1 && Convert.ToInt32(dt.Rows[0][0]) == 0)
{
return true;
}
}
return false;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return false;
}
如有任何帮助,我们将不胜感激。
您可以尝试使用一次存根。我已经使用 Stub 编写了一个简单的测试用例。它按预期工作。这是代码:
[TestMethod]
public void Test01()
{
using (ShimsContext.Create())
{
var dbConnectionOpened = false;
var fakeConnection = new StubDbConnection()
{
Open01 = () => { dbConnectionOpened = true; }
};
var fakeCommand = new StubDbCommand()
{
ExecuteDbDataReaderCommandBehavior = (com) => GetFakeReader()
};
var fakeDbProviderFactory = new StubDbProviderFactory()
{
CreateConnection01 = () => fakeConnection,
CreateCommand01 = () => fakeCommand
};
ShimDbProviderFactories.GetFactoryString = (arg1) => fakeDbProviderFactory;
var val = SqlConnectionFactory.TableDoesNotExist("testTable", "conn");
Assert.IsTrue(dbConnectionOpened);
Assert.IsTrue(val);
}
}
private DbDataReader GetFakeReader()
{
const int count = 0;
var dt = new DataTable("Test-Table");
dt.Columns.Add(new DataColumn("Count"));
dt.Rows.Add(count);
return dt.CreateDataReader();
}
您可以使用 GetFakeReader() 方法对各种场景进行单元测试。
我正在尝试为我们拥有的旧代码创建单元测试 (NUnit)。
我们使用 DbProviderFactory 检查数据库中是否存在 table,然后再对 table 执行任何操作。
我知道这看起来更像是集成测试,但不管你怎么称呼它,我都需要对其进行测试。我更愿意使用自包含的东西而不依赖于数据库。
我尝试使用 excel 作为我的数据源但是 select table 在 excel 它应该在 table 名称之后有 $在我的案例中不起作用,因为我不想修改我的代码以适应单元测试。
如何对以下代码进行单元测试?
static bool TableDoesNotExist(string tableName, string connectionString, string providerName = "System.Data.OleDb")
{
try
{
DbProviderFactory providerFactory = DbProviderFactories.GetFactory(providerName);
using (DbConnection conn = providerFactory.CreateConnection())
{
conn.ConnectionString = connectionString;
conn.Open();
DbCommand cmd = providerFactory.CreateCommand();
cmd.Connection = conn;
string tblQuery = "";
if (providerName == "System.Data.Odbc")
tblQuery = string.Format("SELECT COUNT(*) FROM SYSTABLE WHERE TABLE_NAME = '{0}'", tableName);
else
tblQuery = string.Format("SELECT COUNT(*) FROM [INFORMATION_SCHEMA.TABLES$] WHERE TABLE_NAME = '{0}'", tableName);
cmd.CommandText = tblQuery;
Console.WriteLine(cmd.CommandText);
DbDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
if (dt.Rows.Count == 1 && Convert.ToInt32(dt.Rows[0][0]) == 0)
{
return true;
}
}
return false;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return false;
}
如有任何帮助,我们将不胜感激。
您可以尝试使用一次存根。我已经使用 Stub 编写了一个简单的测试用例。它按预期工作。这是代码:
[TestMethod]
public void Test01()
{
using (ShimsContext.Create())
{
var dbConnectionOpened = false;
var fakeConnection = new StubDbConnection()
{
Open01 = () => { dbConnectionOpened = true; }
};
var fakeCommand = new StubDbCommand()
{
ExecuteDbDataReaderCommandBehavior = (com) => GetFakeReader()
};
var fakeDbProviderFactory = new StubDbProviderFactory()
{
CreateConnection01 = () => fakeConnection,
CreateCommand01 = () => fakeCommand
};
ShimDbProviderFactories.GetFactoryString = (arg1) => fakeDbProviderFactory;
var val = SqlConnectionFactory.TableDoesNotExist("testTable", "conn");
Assert.IsTrue(dbConnectionOpened);
Assert.IsTrue(val);
}
}
private DbDataReader GetFakeReader()
{
const int count = 0;
var dt = new DataTable("Test-Table");
dt.Columns.Add(new DataColumn("Count"));
dt.Rows.Add(count);
return dt.CreateDataReader();
}
您可以使用 GetFakeReader() 方法对各种场景进行单元测试。