Поблочное тестирование простой класс набора

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

, Если Вы программно генерируете SQL-оператор от набора имен столбцов, Вы не управляете, тогда можно избежать проблем, всегда используя скобки.

5
задан Ohad Schneider 28 July 2009 в 16:17
поделиться

3 ответа

Ваш тест мне кажется совершенно нормальным. Возможно, вы неправильно поняли принцип модульного тестирования.

Отдельный тест должен (в идеале) проверять только одно, это правда, но это не означает, что он должен тестировать только один метод; скорее, он должен проверять только одно поведение (инвариант, соблюдение определенного бизнес-правила и т. д.).

Ваш тест проверяет поведение «если вы добавляете в новый набор, он больше не пустой ", что является единичным поведением: -).

Для решения других ваших вопросов:

  • Теоретически может быть ошибка в обоих, которая проявляется только в сценариях, где они не вызываются один за другим.
    Верно, но это означает, что вам нужно больше тестов :-). Например, добавьте два номера, затем вызовите "Содержит" или вызовите "Содержит" без добавления.

  • Альтернативный подход может предложить имитировать или раскрыть (возможно, используя InternalsVisibleTo) частный член _list и заставить тест проверять его напрямую, но это потенциально может создать проблемы с ремонтопригодностью теста [...]
    Совершенно верно, поэтому не не делай этого. Модульный тест всегда должен соответствовать общедоступному интерфейсу тестируемого модуля. Вот почему это называется модульным тестом, а не «возиться внутри модуля» -тест; -).

9
ответ дан 13 December 2019 в 19:32
поделиться

Есть две возможности.

  1. You ' вы обнаружили изъян в вашем дизайне. Вам следует внимательно подумать, понятны ли действия, выполняемые вашим методом Add, для потребителя. Если вы не хотите, чтобы люди добавляли дубликаты в список, зачем вообще использовать метод Contains ()? Пользователь будет сбит с толку, если он не будет добавлен в список и не будет выдано никаких ошибок. Хуже того, они могут дублировать функциональность, написав тот же самый код перед вызовом .Add () в своей коллекции списков. Может быть, его следует удалить и заменить на индексатор? Из вашего класса списка не ясно, что он не предназначен для хранения дубликатов.

  2. Дизайн в порядке, и ваши общедоступные методы должны полагаться друг на друга. Это нормально, и нет причин, по которым вы не можете протестировать оба метода. Теоретически, чем больше у вас тестовых примеров, тем лучше.

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

1
ответ дан 13 December 2019 в 19:32
поделиться

На практике ваш текущий тест подходит. Для чего-то такого простого очень маловероятно, что ошибки в add () и contains () будут взаимно сговориться, чтобы скрыть друг друга. В тех случаях, когда вы действительно озабочены тестированием только add () и add (), одним из решений будет сделать вашу переменную _list доступной для вашего кода модульного тестирования.

[TestClass]
public void Add_AddOneNumber_SetContainsAddedNumber() {
    MyIntSet set = new MyIntSet();
    set.add(0);
    Assert.IsTrue(set._list.Contains(0));
}

Это имеет два недостатка. Первый: для этого требуется доступ к частной переменной _list, которая немного сложна в C # (я рекомендую метод отражения ). Два: это делает ваш тестовый код зависимым от фактической реализации вашей реализации Set, что означает, что вам придется изменить тест, если вы когда-либо измените реализацию. Я бы никогда не сделал этого для чего-то столь же простого, как класс коллекций, но в некоторых случаях это может быть полезно.

1
ответ дан 13 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: