Лучшие практики разработки через тестирование Используя C# и [закрытый] RhinoMocks

Если вы используете gcc, можно использовать:

const char * enum_to_string_map[]={ [enum1]='string1', [enum2]='string2'};

Затем просто вызовите экземпляр

enum_to_string_map[enum1]
86
задан Kevin Albrecht 9 September 2009 в 23:31
поделиться

7 ответов

Определенно хороший список. Вот несколько мыслей о нем:

Запись тест сначала, тогда код.

я соглашаюсь на высоком уровне. Но, я был бы более конкретным: "Запишите тест сначала, затем запишите как раз код, чтобы пройти тест и повторение". Иначе я боялся бы, что мои модульные тесты будут больше походить на интеграцию или приемочные испытания.

классы Дизайна с помощью внедрения зависимости.

Согласованный. Когда объект создает свои собственные зависимости, Вы не имеете никакого контроля над ними. Инверсия Управления / Внедрение зависимости дает Вам что контроль, позволяя Вам изолировать объект под тестом с насмешками/тупиками/и т.д. Это - то, как Вы тестируете объекты в изоляции.

Отдельный код UI от его поведения с помощью Образцового Контроллера Представления или Образцового Предъявителя Представления.

Согласованный. Обратите внимание, что даже предъявитель/контроллер может быть протестирован с помощью DI/МОК, путем вручения его блокировал/дразнил представление и модель. Выезд Предъявитель Сначала TDD для больше на этом.

не пишут статические методы или классы.

Не уверенный я соглашаюсь с этим. Это возможно к модульному тесту статический метод / класс, не используя насмешки. Так, возможно, это - один из тех Насмешка Носорога определенные правила, которые Вы упомянули.

Программа от интерфейсов, не классы.

я соглашаюсь, но по немного отличающейся причине. Интерфейсы обеспечивают большую гибкость разработчику программного обеспечения - вне просто поддержки различных платформ фиктивного объекта. Например, не возможно поддерживать DI правильно без интерфейсов.

Изолируют внешние зависимости.

Согласованный. Скройте внешние зависимости позади своего собственного фасада или адаптера (как соответствующие) с интерфейсом. Это позволит Вам изолировать свое программное обеспечение от внешней зависимости, быть им веб-сервис, очередь, база данных или что-то еще. Это особенно важно, когда Ваша команда не управляет зависимостью (иначе внешний).

Mark как виртуальный методы Вы намереваетесь дразнить.

Это - ограничение Насмешек Носорога. В среде, которая предпочитает, рука кодировала тупики по платформе фиктивного объекта, которая не будет необходима.

И, несколько новых вопросов для рассмотрения:

Использование creational шаблоны разработки. Это поможет с DI, но он также позволяет Вам изолировать тот код и тестировать его независимо от другой логики.

Тесты записи с помощью метод Расположения/Закона/Утверждать Следа счета . Эта техника делает его очень ясным, какая конфигурация необходима, что на самом деле тестируется, и что ожидается.

не боятся к насмешкам/тупикам самокрутки. Часто, Вы найдете, что использование платформ фиктивного объекта делает Ваши тесты невероятно трудно для чтения. Путем прокрутки собственного Вы будете иметь полный контроль над своими насмешками/тупиками, и Вы будете в состоянии сохранить свои тесты читаемыми. (Вернитесь к предыдущей точке.)

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

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

58
ответ дан aridlehoover 24 November 2019 в 08:07
поделиться

Если Вы работаете с.Net 3.5, можно хотеть изучить библиотека насмешки Moq - это использует деревья выражений и лямбды для удаления неинтуитивной идиомы рекордного ответа большинства других библиотек насмешки.

Выезд этот быстрый запуск для наблюдения, сколько еще интуитивный тестовые сценарии становятся вот простой пример:

// ShouldExpectMethodCallWithVariable
int value = 5;
var mock = new Mock<IFoo>();

mock.Expect(x => x.Duplicate(value)).Returns(() => value * 2);

Assert.AreEqual(value * 2, mock.Object.Duplicate(value));
10
ответ дан JabberwockyDecompiler 24 November 2019 в 08:07
поделиться

Знайте различие между фальшивки, насмешки и тупики и когда использовать каждого.

Избегают по определению взаимодействий с помощью насмешек. Это делает тесты хрупкими .

6
ответ дан Hamish Smith 24 November 2019 в 08:07
поделиться

Хороший список. Одна из вещей, которые Вы могли бы хотеть установить - и я не могу дать Вам много совета, так как я только начинаю думать об этом сам - когда класс должен быть в различной библиотеке, пространстве имен, вложил пространства имен. Вы могли бы даже хотеть выяснить список библиотек и пространств имен заранее и мандата, который команда должна встретиться и решить объединиться два/добавлять новая.

, О, просто думал о чем-то, что я делаю это, Вы могли бы хотеть также. У меня обычно есть библиотека модульных тестов с тестовым приспособлением на политику класса, где каждый тест входит в соответствующее пространство имен. Я также склонен иметь другую библиотеку тестов (интеграционные тесты?), который находится в больше стиль BDD . Это позволяет мне тестам записи к спецификации, что должен сделать метод, а также что приложение должно сделать в целом.

1
ответ дан George Mauer 24 November 2019 в 08:07
поделиться

Вот другой, что я думал об этом, мне нравится делать.

, Если Вы планируете запустить тесты от модульного теста Gui в противоположность от TestDriven. Сеть или NAnt тогда я нашел легче установить тип проекта поблочного тестирования на консольное приложение, а не библиотеку. Это позволяет Вам запускать тесты вручную и шаг через них в режиме отладки (который вышеупомянутый TestDriven. Сеть может на самом деле сделать для Вас).

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

0
ответ дан George Mauer 24 November 2019 в 08:07
поделиться

This is a very helpful post!

I would add that it is always important to understand the Context and System Under Test (SUT). Following TDD principals to the letter is much easier when you're writing new code in an environment where existing code follows the same principals. But when you're writing new code in a non TDD legacy environment you find that your TDD efforts can quickly balloon far beyond your estimates and expectations.

For some of you, who live in an entirely academic world, timelines and delivery may not be important, but in an environment where software is money, making effective use of your TDD effort is critical.

TDD is highly subject to the Law of Diminishing Marginal Return. In short, your efforts towards TDD are increasingly valuable until you hit a point of maximum return, after which, subsequent time invested into TDD has less and less value.

I tend to believe that TDD's primary value is in boundary (blackbox) as well as in occasional whitebox testing of mission-critical areas of the system.

3
ответ дан 24 November 2019 в 08:07
поделиться

Настоящая причина программирования с использованием интерфейсов не в том, чтобы облегчить жизнь Rhino, а в том, чтобы прояснить отношения между объектами в коде. Интерфейс должен определять сервис, который требуется объекту из его среды. Класс предоставляет конкретную реализацию этой службы. Прочтите книгу Ребекки Вирфс-Брок «Дизайн объекта» о ролях, обязанностях и сотрудниках.

2
ответ дан 24 November 2019 в 08:07
поделиться
Другие вопросы по тегам:

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