如何测试具有数据库查询以更新数据的方法?

时间:2011-11-18 12:02:13

标签: c# sql unit-testing integration-testing

我有以下方法:

public void ImportDataCommand()
{
    // some data validation logic here

    if (some_criteria_is_true)
    {
        // Call to a method which uses sql queries to update some records
        UpdateRecords();
    }
    else
    {
        // Call to a method which uses sql queries to delete some records
        DeleteRecords();
    }
}
  • 如何对测试方法UpdateRecords()DeleteRecords()进行单元测试? (如果可能的话)
  • 是我现有的模式,a 闻?
  • 当你有一些数据时,是否有更好的方法来处理 更新逻辑,它取决于一些数据验证逻辑和一些 条件逻辑?

非常感谢这方面的任何帮助。如果您需要更多信息或有些不明确的地方,请告诉我。

更新

我对这里嘲笑数据源不感兴趣。我想确定我的sql查询是否正确并且正在进行正确的更新。很抱歉这个混乱,如果您认为,我想测试我的验证逻辑而不是我的数据更新逻辑(sql)。

我确实有使用模拟框架的经验,并且我确实成功地使用它们为我的正常应用程序逻辑编写单元测试。

4 个答案:

答案 0 :(得分:3)

您的问题始于短语'以及'

在同一个类中没有验证和数据访问权限 - 将数据访问委托给另一个类并注入它 - 这样您就可以在测试验证时模拟数据源。

class Bar {
private DataAccessService service

public void Foo()
{
    // some data validation logic here

    if (some_criteria_is_true)
    {
        // Call to a method which uses sql queries to update some records
        service.updateBarRecords();
    }
    else
    {
        // Call to a method which uses sql queries to delete some records
        service.deleteBarRecords();
    }
}

}

然后,您可以使用模拟框架来测试是否调用了正确的服务方法。

答案 1 :(得分:0)

这取决于您的应用程序的整个架构和公司的IT / DB基础架构,以及您可以在中型或大型公司中强制执行的数据策略。

过去人们曾经有一个SQLite实例用于单元测试,或者你可以使用相同的技术,例如SQL Server,但是有单元测试来连接到开发或QA数据库服务器,肯定不是生产。

我过去做过的一件事就是在命令执行时进行事务处理,并在单元测试中回滚事务,因此DEV / QA数据库中没有任何内容,但是命令执行的测试是无论如何都要表现。

答案 2 :(得分:0)

当您进行单元测试时,您特别只关注该单元,即此处的方法。因此,当您编写测试用例时,您可以模拟通常通过依赖注入调用的其他方法(如果它是API调用或某些东西)。其他方面,你只是猜测和编写测试用例的方法。

因此,在您的代码案例中,您可以单独为Foo(),UpdateBarRecords()和DeleteBarRecords()编写测试用例。

忽略所有方法调用(对其进行单元测试),并专注于您在该方法中编写的核心逻辑代码,并将其集中用于单元测试。

答案 3 :(得分:0)

恕我直言,你应该在你的代码中解决这个问题:

  1. Foo不是单元可测试的,因为它不会返回任何内容
  2. 您正在将数据访问耦合到您的应用逻辑,这会使不同的层太紧密连接到实际单元测试它们
  3. 可能一种根据某种情况调用更新和删除的方法是一种气味......两种不同的行为不应该更好吗?
  4. 由于Foo的命名不是自我解释,因此没有其他内容,但如果您可以详细说明方法的上下文,我们可以添加更多备注。