如何编写ExecuteNonQuery&;执行标量&;GetDataSet方法

本文关键字:amp GetDataSet 方法 标量 执行 何编写 ExecuteNonQuery | 更新日期: 2023-09-27 18:26:14

我正在为我的应用程序编写一个单元测试用例。在我的应用程序中,我使用的是SQLite数据库。我想嘲笑以下方法。比如,ExecuteNonQuery、ExecuteScalar、GetDataSet。我在下面写我的方法。

请任何人帮我为以下方法编写模拟单元测试用例。

执行非查询

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);
}

如何编写ExecuteNonQuery&;执行标量&;GetDataSet方法

您可能想要应用依赖性反转原则,该原则指出您应该依赖于抽象,而不是具体化。

这是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来验证你的断言。