C# 如何为ExecuteOnQuery编写模拟单元测试用例&;行政长官;GetDataSet方法
我正在为我的应用程序编写一个单元测试用例。在我的应用程序中,我正在使用SQLite数据库。我想模拟以下方法。例如,ExecuteOnQuery、ExecuteScalar、GetDataSet。我正在下面编写我的方法 请任何人帮我为下面的方法编写模拟单元测试用例 执行查询C# 如何为ExecuteOnQuery编写模拟单元测试用例&;行政长官;GetDataSet方法,c#,testing,case,moq,C#,Testing,Case,Moq,我正在为我的应用程序编写一个单元测试用例。在我的应用程序中,我正在使用SQLite数据库。我想模拟以下方法。例如,ExecuteOnQuery、ExecuteScalar、GetDataSet。我正在下面编写我的方法 请任何人帮我为下面的方法编写模拟单元测试用例 执行查询 using (SQLiteConnection objCon = objISQLite.OpenConnection(DBNAME)) { objCon.Open(); using (SQLiteComma
using (SQLiteConnection objCon = objISQLite.OpenConnection(DBNAME))
{
objCon.Open();
using (SQLiteCommand objCmd = new SQLiteCommand(strSQL, objCon))
{
intRetValue = objCmd.ExecuteNonQuery();
objCmd.Dispose();
}
objCon.Close();
objCon.Dispose();
}
ExecuteScalar
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”。首字母缩略词(参见SOLID编程和依赖倒置原则) 在这里,您可以将SQLite的具体用法与数据库访问紧密结合起来。
在您使用的类中,您应该依赖于将要模拟的数据库访问抽象(让我们称之为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();
}
}
}
通过在类中注入DbManager的抽象,可以减少类与数据库(这里是SQLite)的具体使用之间的耦合,从而提高其单元可测试性
单元测试这个类变得很容易,因为您只需要传递IDatabaseManager的mock,您将设置它以返回IDbConnection和IDbCommand的mock来验证您的断言