Юнит-тестирование простого класса коллекции
Рассмотрим следующий класс:
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