簡體   English   中英

如何為ExecuteNonQuery和ExecuteScalar和GetDataSet方法編寫模擬單元測試用例

[英]How to write mock unit test case for ExecuteNonQuery & ExecuteScalar & GetDataSet method

我正在為我的應用程序編寫一個單元測試用例。在我的應用程序中,我正在使用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);
}

您可能要應用依賴關系反轉原則,該原則規定您應該依賴抽象,而不是依賴於具體概念。

這是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的模擬以驗證您的斷言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM