如何为 ExecuteNonQuery & ExecuteScalar & GetDataSet 方法编写模拟单元测试用例
How to write mock unit test case for ExecuteNonQuery & ExecuteScalar & GetDataSet method
我正在为我的 application.In 我的应用程序编写单元测试用例,我正在使用 SQLite datebase.I 想模拟以下 methods.Like,ExecuteNonQuery, ExecuteScalar, GetDataSet.I我在下面写我的方法。
拜托,任何人都可以帮助我为以下方法编写模拟单元测试用例。
ExecuteNonQuery
using (SQLiteConnection objCon = objISQLite.OpenConnection(DBNAME))
{
objCon.Open();
using (SQLiteCommand objCmd = new SQLiteCommand(strSQL, objCon))
{
intRetValue = objCmd.ExecuteNonQuery();
objCmd.Dispose();
}
objCon.Close();
objCon.Dispose();
}
执行标量
using (SQLiteConnection objCon = OpenConnection(DBNAME))
{
objCon.Open();
using (SQLiteCommand objCmd = new SQLiteCommand(strSQL, objCon))
{
objRetValue = objCmd.ExecuteScalar();
objCmd.Dispose();
}
objCon.Close();
objCon.Dispose();
}
GetDataSet
using (DataSet dsData = new DataSet())
{
using (SQLiteConnection objCon = OpenConnection(DBNAME))
{
objCon.Open();
using (SQLiteDataAdapter objAdp = new SQLiteDataAdapter(strSQL,objCon))
{
dsData.Reset();
objAdp.Fill(dsData);
objAdp.Dispose();
}
objCon.Close();
objCon.Dispose();
}
return (#Dataset);
}
您可能想要应用依赖倒置原则,该原则规定您应该依赖于抽象,而不是具体化。
这是 S.O.L.I.D 的 'D'。首字母缩略词(依赖倒置原则见this link for SOLID programming and this link)
在这里,您与用于数据库访问的 SQLite 的具体用法紧密结合。
在您使用的 class 中,您应该依赖于您将模拟的数据库访问抽象(我们将其命名为 DatabaseManager)。
此外,您会更喜欢使用接口(即 IDbCommand 而不是 SQLiteCommand,...),因为它更易于维护,更明确您的意图并且更容易模拟。
例如你的代码可以变成这样:
interface IDatabaseManager
{
IDbConnection OpenConnection(string databaseName);
IDbCommand CreateCommand(string command, IDbConnection connection);
}
class MyClass
{
private IDatabaseManager _databaseManager;
public MyClass(IDatabaseManager databaseManager)
{
_databaseManager = databaseManager;
}
public void ExecutScalarMethod()
{
using (var objCon = _databaseManager.OpenConnection(DBNAME))
{
objCon.Open();
using (SQLiteCommand objCmd = _databaseManager.CreateCommand(strSQL, objCon))
{
objRetValue = objCmd.ExecuteScalar();
objCmd.Dispose();
}
objCon.Close();
objCon.Dispose();
}
}
}
通过在 class 中注入 DbManager 的抽象,您正在减少 class 与数据库(此处为 SQLite)的具体使用之间的耦合,从而提高其单元可测试性。
这个 class 的单元测试变得很容易,因为您只需将要设置的 IDatabaseManager 的模拟传递给 IDbConnection 和 IDbCommand 的 return 模拟来验证您的断言。
我正在为我的 application.In 我的应用程序编写单元测试用例,我正在使用 SQLite datebase.I 想模拟以下 methods.Like,ExecuteNonQuery, ExecuteScalar, GetDataSet.I我在下面写我的方法。
拜托,任何人都可以帮助我为以下方法编写模拟单元测试用例。
ExecuteNonQuery
using (SQLiteConnection objCon = objISQLite.OpenConnection(DBNAME))
{
objCon.Open();
using (SQLiteCommand objCmd = new SQLiteCommand(strSQL, objCon))
{
intRetValue = objCmd.ExecuteNonQuery();
objCmd.Dispose();
}
objCon.Close();
objCon.Dispose();
}
执行标量
using (SQLiteConnection objCon = OpenConnection(DBNAME))
{
objCon.Open();
using (SQLiteCommand objCmd = new SQLiteCommand(strSQL, objCon))
{
objRetValue = objCmd.ExecuteScalar();
objCmd.Dispose();
}
objCon.Close();
objCon.Dispose();
}
GetDataSet
using (DataSet dsData = new DataSet())
{
using (SQLiteConnection objCon = OpenConnection(DBNAME))
{
objCon.Open();
using (SQLiteDataAdapter objAdp = new SQLiteDataAdapter(strSQL,objCon))
{
dsData.Reset();
objAdp.Fill(dsData);
objAdp.Dispose();
}
objCon.Close();
objCon.Dispose();
}
return (#Dataset);
}
您可能想要应用依赖倒置原则,该原则规定您应该依赖于抽象,而不是具体化。
这是 S.O.L.I.D 的 'D'。首字母缩略词(依赖倒置原则见this link for SOLID programming and this link)
在这里,您与用于数据库访问的 SQLite 的具体用法紧密结合。
在您使用的 class 中,您应该依赖于您将模拟的数据库访问抽象(我们将其命名为 DatabaseManager)。
此外,您会更喜欢使用接口(即 IDbCommand 而不是 SQLiteCommand,...),因为它更易于维护,更明确您的意图并且更容易模拟。
例如你的代码可以变成这样:
interface IDatabaseManager
{
IDbConnection OpenConnection(string databaseName);
IDbCommand CreateCommand(string command, IDbConnection connection);
}
class MyClass
{
private IDatabaseManager _databaseManager;
public MyClass(IDatabaseManager databaseManager)
{
_databaseManager = databaseManager;
}
public void ExecutScalarMethod()
{
using (var objCon = _databaseManager.OpenConnection(DBNAME))
{
objCon.Open();
using (SQLiteCommand objCmd = _databaseManager.CreateCommand(strSQL, objCon))
{
objRetValue = objCmd.ExecuteScalar();
objCmd.Dispose();
}
objCon.Close();
objCon.Dispose();
}
}
}
通过在 class 中注入 DbManager 的抽象,您正在减少 class 与数据库(此处为 SQLite)的具体使用之间的耦合,从而提高其单元可测试性。
这个 class 的单元测试变得很容易,因为您只需将要设置的 IDatabaseManager 的模拟传递给 IDbConnection 和 IDbCommand 的 return 模拟来验证您的断言。