我有一个类,它实现了一个专门的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());
}
发布于 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()
。
https://stackoverflow.com/questions/54989669
复制相似问题