【问题标题】:Unit Testing a Class Wrapping a Container单元测试包装容器的类
【发布时间】:2017-03-10 16:58:34
【问题描述】:

我的类包装了一个 C# List 以通过输入验证对其进行扩展。我测试了使用有效数据调用 AddRows() 方法的简单案例,并检查项目是否已添加到内部列表中。

在我看来,我的测试应该只关心是否在 List 上调用了 AddRange(),但实际上我必须手动检查这些元素是否已添加到基础列表中。我觉得这超出了测试的范围,因为它测试的是 List 而不是 ManagedList 提供的功能。

我可以通过将 List 作为对 ManagedList 类的依赖项注入并在我的测试中替换为一个模拟列表来验证是否使用正确的数据调用 AddRange() 来解决此问题。但是,必须将 List 作为依赖项传递到我的 ManagedList 类中似乎有点过头了。

我觉得我有两个选择:

  • 内部列表已提供测试功能
  • 将列表作为依赖项注入,以便对其进行模拟

我在这里错过了明显的第三个选项吗?如果不是,以上哪一项是更可取的选择?

总结

托管列表类

class ManagedList
{
    private readonly List<Dictionary<string, object>> _data = new List<Dictionary<string, object>>();

    public ReadOnlyCollection<Dictionary<string, object>> GetData()
    {
        return new ReadOnlyCollection<Dictionary<string, object>>(_data);
    }

    public void AddRows(List<Dictionary<string, object>> rows)
    {
        if (rows.Any(row => !row.ContainsKey("id")))
            throw new Exception("All rows must have an id");

        _data.AddRange(rows);
    }
}

测试

[Test]
public void AddRowsSucceedsWithId()
{
    var managedList = new ManagedList();
    var row = new Dictionary<string, object> {{"id", "Item1"}};
    var rows = new List<Dictionary<string, object>> {row, row, row};

    CollectionAssert.IsNotSupersetOf(managedList.GetData(), rows);

    managedList.AddRows(rows);

    CollectionAssert.IsSupersetOf(managedList.GetData(), rows);
}

【问题讨论】:

  • 为什么不尝试将两者结合起来。

标签: c# unit-testing dependency-injection nunit


【解决方案1】:

为什么不改为更改字典类型以使用接口来强制执行您的要求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2021-04-10
    • 2016-12-30
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多