如何为ExecuteNonQuery和ExecuteScalar和GetDataSet方法编写模拟单元测试用例

普拉蒂克·拉坦帕拉(Pratik Ratanpara)

我正在为我的应用程序编写一个单元测试用例。在我的应用程序中,我使用的是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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为方法编写单元测试用例[Angular]

如何为BadRequest编写单元测试用例?

如何为Perl脚本编写单元测试用例

如何为Android API编写单元测试用例?

如何为android方法和类编写单元测试?

如何在 angular 7 中使用 jasmine 和 karma 编写单元测试用例

如何为Ansible功能创建单元测试用例?

如何为没有输入和输出的方法编写单元测试?

如何在 Angular 中为 HTTPClient get() 方法服务编写单元测试用例?

自动生成.NET和Java的单元测试用例

如何为 jQuery on() 方法编写 Jasmine 测试用例

如何为抽象类方法编写测试用例

如何为线程运行方法编写junit测试用例

如何为给定方法编写测试用例

如何为其余客户编写针对Webtarget和响应的Mock测试用例?

如何为 ProcessBuilder 编写测试用例

如何编写JUnit测试用例以测试线程和事件

如何为使用PouchDB的角度应用编写单元测试和/或集成测试

PHP单元测试:在执行测试用例时不会触发模拟方法

如何为测试用例生成一些报告以进行单元测试?

在单元测试用例中模拟Angular $ window

模拟单元测试用例所需的类更改

在VS2012中编写单元测试用例

如何为python单元测试提供模拟类方法?

如何为这些类型的方法编写单元测试?

如何为返回匿名函数的方法编写单元测试

如何为此类中的方法编写单元测试?

在我的单元测试用例中模拟我的 ActionContext 的正确方法是什么?

为具有无参数方法的接口编写单元测试用例