这个类怎么可以单元测试?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (22)

我有一个类,它实现了一种专门的缓冲区类型的集合。对我而言,例如Flush方法似乎不是单元可测试的。如果我,我想测试如果我添加数据会发生什么,刷新它,再次添加数据然后再次刷新它以查看我是否只获得在第一次刷新后添加的数据。为了能够做到这一点,我也必须使用Add方法。在作为测试类的一部分的测试中使用另一种方法,并且应该单独进行单元测试,这是一种不好的做法吗?这个类甚至是单元可测试的吗?这些问题突然出现,我无法回答。提前致谢!

public class DataBuffer : IDataBuffer
{
    private Dictionary<string, List<Dictionary<string, object>>> buffer;

    public DataBuffer()
    {
        buffer = new Dictionary<string, List<Dictionary<string, object>>>();
    }

    public void Add(string type, Dictionary<string, object> data)
    {
        if (!buffer.ContainsKey(type))
        {
            buffer[type] = new List<Dictionary<string, object>>();
        }
        buffer[type].Add(metrics);
    }

    public Dictionary<string, List<Dictionary<string, object>>> Flush()
    {
        var result = buffer;
        buffer = new Dictionary<string, List<Dictionary<string, object>>>();

        return result;
    }

    public int Count(string type) => buffer[type].Count;
}

基本上我想写一个像这样的单元测试。这看起来像是有效的吗?

    [TestMethod]
    public void Flush_NoDataIsGivenBackTwice()
    {
        var data1 = new Dictionary<string, object>
        { 
            { "key1", "value1" } 
        };
        dataBuffer.Add("type", data1);

        var result1 = dataBuffer.Flush();

        Assert.AreEqual(1, result1["type"].Count);
        Assert.AreSame(data1, result1["type"].First());

        var data2 = new Dictionary<string, object>
        {
            { "key2", "value2" }
        };
        dataBuffer.Add("type", data2);

        var result2 = dataBuffer.Flush();

        Assert.AreEqual(1, result2["type"].Count);
        Assert.AreSame(data2, result2["type"].First());
    }
提问于
用户回答回答于

我不明白为什么这个类不容易测试。我想我想就一些实施选择挑战你。

为什么在创建新实例之前回馈当前的事务状态?我认为Flush()/ Clear()方法应该只是一个空白。

为什么你不只是应用Clear()底层缓冲区并使字段只读?

为什么你不是更加防守Count(string type)?我认为应该做这样的事情:

public int Count(string type)
{
    if(buffer.TryGet(type, out List<Dictionary<string, object>> subset)
    {
        return subset.Count;
    }
    return 0;
 }

我也希望TryGet()Add()方法中使用。

扫码关注云+社区

领取腾讯云代金券