首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >怎样才能使这个类成为单元可测试的?

怎样才能使这个类成为单元可测试的?
EN

Stack Overflow用户
提问于 2019-03-05 02:48:25
回答 1查看 74关注 0票数 0

我有一个类,它实现了一个专门的buffer类型的集合。例如,对我来说,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());
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-05 03:44:46

我不明白为什么这个类不容易测试。我想在一些实现选择上向您提出挑战。

为什么要在创建新实例之前返回当前的事务状态?我认为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;
 }

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54989669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档