【问题标题】:How to unit test DataRow with a lot of columns in C#如何在 C# 中使用大量列对 DataRow 进行单元测试
【发布时间】:2016-09-19 21:22:49
【问题描述】:

在 C# 中对 DataRows 进行单元测试的最佳方法是什么?

我有一个类架构,其中所有数据都存储在 DataRow 变量中。这个怎么运作?例如,当我双击客户列表中的一条记录时,我将客户表中的整个记录​​加载到 _dataRow 变量中。 问题是 Customer 表有超过 200 列。

问题是,我是否需要手动创建 DataRow 变量并填充每个测试方法中的所有列?或者也许有一些模拟工具来模拟所有 DataRow 列?

class Customer
{
    private DataRow _dataRow;

    public Customer(DataRow dataRow)
    {
        _dataRow = dataRow;
    }

    private string GetCustomerName()
    {
        return Convert.ToString(_dataRow["Name"]);
    }

    private string GetCustomerAddress()
    {
        return Convert.ToString(_dataRow["Street"]) + " " + Convert.ToString(_dataRow["House_No"]);
    }

    private int GetAge()
    {
        DateTime birthdate = Convert.ToDateTime(_dataRow["Birthdate"]);
        DateTime today = DateTime.Today;
        int age = today.Year - birthdate.Year;
        if (birthdate > today.AddYears(-age))
            age--;
        return age;
    }
}

【问题讨论】:

  • 为什么不能只使用带有记录的硬编码数据表并在单元测试中注入数据行

标签: c# winforms unit-testing mocking


【解决方案1】:

您不需要在 every 测试中模拟/设置 DataRow 的 every 列。每个测试应该只测试一小部分功能,因此应该只使用 200 列中的一个子集。

任何影响测试输出的列都应该明确设置或模拟(即没有捷径!)。如果特定列不影响测试的输出,但仍需要设置(例如为了防止抛出异常),那么您可能需要重新考虑类的设计。

如果在考虑了这一点之后,您仍然需要在每个测试中设置所有 200 列,然后考虑创建一个方法来创建一个填充有 200 个默认值的数据行,然后覆盖这些值这对于该特定测试很重要。根据第 1 段,这应该只是每个测试中 200 列的一小部分。

【讨论】:

  • 谢谢,这听起来很合乎逻辑。我将使用 200 列中的一个子集,只有测试方法需要这些列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多