【问题标题】:Would a Unit Test add any value to this example of a DAL provider beyond an Integration Test?除了集成测试之外,单元测试是否会为这个 DAL 提供程序示例添加任何价值?
【发布时间】:2011-01-07 18:02:28
【问题描述】:
public List<int> GetPortfolioList()
{
    using (var connection = new SqlConnection("<connectionString>"))
    using (var command = new SqlCommand("SELECT * FROM Portfolio", connection))
    {
        connection.Open();
        var portfolioTable = SqlHelper.GetDataTable(command);
        var portfolios = from DataRow row
                            in portfolioTable.Rows
                            select int.Parse(row["Portfolio"].ToString());

        return portfolios.ToList();
    }
}

正如名称(和代码)所暗示的那样,在 SQL DAL 提供程序中使用此方法来检索投资组合列表。因为用于集成测试的数据库表包含一组相当静态的数据,所以我们可以针对多个期望进行断言。例如投资组合列表将: - 不能为空 - 包含某些已知值 - 不包含重复项

在同行评审之后,有人坚持认为该代码没有经过适当的测试(孤立地),因为它依赖于数据库访问。如果在确保此方法从状态得到保证的数据库中返回数据中找到了大部分价值,我一直无法看到模拟数据库调用以为此方法编写单元测试的价值.我错过了什么吗?

【问题讨论】:

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


    【解决方案1】:

    我会采取相反的观点,因为我刚刚完成了一个假数据库(在内存列表中使用)以使 linq to sql(或 linq to any)可单元测试。

    这是我用来选择一种合适的方法来伪造/模拟数据库的一个问题。 (不过,从阅读您的代码来看,嵌入的“SELECT * FROM”意味着您更依赖 SQL 而不是 linq,这将使您的代码更难分解为 必须 由 SQL Server 执行的内容以及 linq 能够处理的东西。

    How are people unit testing code that uses Linq to SQL

    我现在可以运行单元测试,根据我的 linq 查询的适用性,该测试将成功或失败即使数据库已从墙上拔下

    例如,如果 row["Portfolio"].ToString() 为 null,您的代码将如何反应,当 this 不返回任何行或返回 2 时,代码将如何反应?

    即使你只是在做集成测试,nunit 也不是一个糟糕的集成测试方法,只是要注意不要将它们称为单元测试,以免纯粹主义者对此感到不安。

    【讨论】:

      【解决方案2】:

      该方法使用 Linq 将数据库中的一些值投影到整数列表中 - 您可能需要测试它是否正确。

      我会将代码分成两部分 - 数据检索和投影(Linq 查询) - 然后您可以使用模拟 data 测试 linq 查询,而无需模拟数据库。

      我还要说单元测试数据访问代码没有什么价值。

      【讨论】:

      • 不过,这些东西都不会对他的代码进行单元测试。一方面,您正在测试 Linq 实现,另一方面,您正在集成测试 db 代码。
      • @kekekela - 不,您将测试他对 linq 的 使用 是否符合预期,即他是否正确地使用。
      【解决方案3】:

      作为一名测试纯粹主义者,我相信我不能对 DAL 进行“单元测试”,因为我无法单独进行。这意味着我的一部分代码,即与数据库交互的代码,没有进行单元测试。上面的代码看起来不错;只需确保它作为更大合同的一部分存在,您可以在其他对象中进行测试。

      不过,我确实执行了集成测试,方法是构建数据库、为其播种并确保我的 DAL 正常工作。

      【讨论】:

        【解决方案4】:

        我同意你的观点,这里唯一的价值就是集成测试,如果不迂腐,真的没有什么可以进行单元测试的。

        当然,该方法的任何调用者的单元测试代码都应该模拟该方法。

        e:MathewMartin 上面提到的例外情况是我认为在这种情况下唯一值得进行单元测试的事情。

        【讨论】:

          猜你喜欢
          • 2021-12-19
          • 2014-09-01
          • 1970-01-01
          • 2013-07-13
          • 2011-09-09
          • 1970-01-01
          • 2013-07-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多