我正在为我的应用程序编写一个单元测试用例。在我的应用程序中,我使用的是SQLite datebase。我想模拟以下方法。例如,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();
}
执行标量
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);
}
您可能要应用依赖关系反转原则,该原则指出您应该依赖抽象,而不是依赖于concret。
这是SOLID首字母缩略词的“ 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的模拟即可,该模拟将被设置为返回IDbConnection和IDbCommand的模拟以验证您的断言。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句