Как правильно тестить
От: Аноним  
Дата: 19.04.12 07:19
Оценка:
Что проверять в подобных случаях:


public class MyClass<T>
{
  private ICollection<T> _collection;
  public MyClass(ICollection collection)
  {
    _collection = collection;
  }
  public void Add(T item)
  {
    _collection.Add(item);
  }
  public void Remove(T item)
  {
    _collection.Remove(item);
  }
}


Заместо ICollection идет мок. Что нужно проверять при тестировании класса, исполнение контрактов методами add и remove или то что эти методы вызывают методы _collection с необходимыми аргументами? ICollection используется просто как пример.
Re: Как правильно тестить
От: vmpire Россия  
Дата: 19.04.12 10:27
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Что проверять в подобных случаях:



А>
А>public class MyClass<T>
А>{
А>  private ICollection<T> _collection;
А>  public MyClass(ICollection collection)
А>  {
А>    _collection = collection;
А>  }
А>  public void Add(T item)
А>  {
А>    _collection.Add(item);
А>  }
А>  public void Remove(T item)
А>  {
А>    _collection.Remove(item);
А>  }
А>}
А>


А>Заместо ICollection идет мок. Что нужно проверять при тестировании класса, исполнение контрактов методами add и remove или то что эти методы вызывают методы _collection с необходимыми аргументами? ICollection используется просто как пример.

Я бы тут ничего не проверял. Если все такие пустые методы проверять, код тестов будет загажен кучей мелких ненужных тестов, которые ничего по сути не проверяют. Лучше то же время потратить на тестирование настоящей логики.
Ну а если уж хочется проверить ВСЁ любой ценой — то да, тестировать только сам факт вызова.
Re: Как правильно тестить
От: -VaS- Россия vaskir.blogspot.com
Дата: 22.04.12 06:13
Оценка:
А>
А>public class MyClass<T>
А>{
А>  private ICollection<T> _collection;
А>  public MyClass(ICollection collection)
А>  {
А>    _collection = collection;
А>  }
А>  public void Add(T item)
А>  {
А>    _collection.Add(item);
А>  }
А>  public void Remove(T item)
А>  {
А>    _collection.Remove(item);
А>  }
А>}
А>


А>Заместо ICollection идет мок. Что нужно проверять при тестировании класса, исполнение контрактов методами add и remove или то что эти методы вызывают методы _collection с необходимыми аргументами? ICollection используется просто как пример.


А какой контракт у Add и Remove? Contract tests ты не показал. Да и я не особенно представляю, какой контракт может быть у данного класса — разве что "не кидать исключение при вызове методов".

Думаю, проблема с этим классов в том, что он не повышает уровень абстракции по сравнению с коллекцией. Поэтому и тестировать в нем нечего. Что нужно сделать, так это удалить его и использовать ICollection<> напрямую. Совсем другое дело, если бы было, например, так:

А>
А>public class MyClass<T>
А>{
А>  ICollection<T> _collection;
A>  AnotherDependency _anotherDependency;
А>  public MyClass(ICollection collection, AnotherDependency anotherDependency)
А>  {
А>    _collection = collection;
A>    _anotherDependency = anotherDependency;
А>  }
А>  public void DoSmartThingWithAnItem(T item)
А>  {
А>    _collection.Add(item);
A>    
A>    if (_collection.Count() > 3)
A>      _anotherDependency.DoLessSmartThingWithAnItem(item);
А>  }
А>  public void Remove(T item)
А>  {
А>    _collection.Remove(item);
А>  }
А>}
А>


Здесь уже можно написать пару отличных тестов — один проверяет, что в коллекцию при каждом вызове действительно добавляются элементы, второй — что вторая зависимость вызывается, если метод коллекции Count() возвращает > 3. Почему первый тест вдруг стал актуальным? Потому что из семантики DoSmartThingWithItem() совершенно не очевидно, что элемент куда-то добавляется. Это новый уровень абстракции.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.