我正在为我的应用程序编写一个单元测试用例。在我的应用程序中,我使用的是SQLite datebase。我想模拟以下方法.Like,ExecuteNonQuery,ExecuteScalar,GetDataSet。我正在编写下面的方法。
请,任何人帮我写下以下方法的模拟单元测试用例。
的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();
}
的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);
}
答案 0 :(得分:0)
您可能希望应用依赖项反转原则,该原则指出您应该依赖于抽象而不是结构。
这是' D' S.O.L.I.D.首字母缩略词(有关SOLID编程,请参阅this link,有关依赖性反转原则,请参阅this link)
在这里,您将与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,你将设置它来返回IDbConnection和IDbCommand的模拟以验证你的断言。