繁体   English   中英

单元测试包装容器的类

[英]Unit Testing a Class Wrapping a Container

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

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

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

我觉得我有2种选择:

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

我是否在这里缺少明显的第三种选择? 如果不是,则上述哪一项是更可取的选择?

综上所述

托管列表类

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);
}

为什么不改为更改字典类型以使用接口来满足您的要求

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM