Юнит-тестирование простого класса коллекции

Рассмотрим следующий класс:

public class MyIntSet
{
    private List<int> _list = new List<int>();

    public void Add(int num)
    {
        if (!_list.Contains(num))
            _list.Add(num);
    }

    public bool Contains(int num)
    {
        return _list.Contains(num);
    }
}

После "только проверить одну вещь" В принципе, предположим, я хочу проверить & quot; Добавить & quot; функция. Рассмотрим следующую возможность для такого теста:

[TestClass]
public class MyIntSetTests
{
    [TestMethod]
    public void Add_AddOneNumber_SetContainsAddedNumber()
    {
        MyIntSet set = new MyIntSet();
        int num = 0;

        set.Add(num);
        Assert.IsTrue(set.Contains(num));
    }
}

Моя проблема с этим решением в том, что оно на самом деле тестирует2 methods: Добавить () и Содержит (). Теоретически, в обоих случаях может быть ошибка, которая проявляется только в сценариях, где они не вызываются один за другим. Конечно, сервер Contains () теперь является тонкой оболочкой для List Contains (), который сам по себе не должен быть проверен, но что, если в будущем он изменится на что-то более сложное? Возможно, простая «тонкая упаковка» метод всегда должен быть сохранен для целей тестирования?

Альтернативный подход может предлагать вычеркнуть или выставить (возможно, с помощью InternalsVisibleTo или PrivateObject) закрытый член _list и заставить тест проверить его напрямую, но это может создать проблемы с удобством сопровождения теста, если когда-нибудь внутренний список будет заменен какой-либо другой коллекцией (может быть, C5). ).

Есть лучший способ сделать это? Являются ли какие-либо из моих аргументов против вышеуказанных реализаций некорректными?

Заранее спасибо, JC

Ответы на вопрос(3)

Ваш ответ на вопрос