Как сделать этот класс тестируемым? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть класс, который реализует специализированный буферный вид коллекции.Мне кажется, что метод 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());
    }

1 Ответ

0 голосов
/ 04 марта 2019

Я не понимаю, почему этот класс не должен легко тестироваться.Я думаю, что хотел бы предложить вам несколько вариантов реализации.

Почему вы возвращаете текущее состояние дел перед созданием нового экземпляра?Я думаю, что метод 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...