Вопрос

Я только что прочитал это Публикация и это приводит доводы против использования неявной типизации при запуске разработки / дизайна на основе тестирования.

В его посте говорится, что TDD может быть "замедлен" при использовании неявной типизации для возвращаемого типа при модульном тестировании метода.Кроме того, он, кажется, хочет, чтобы возвращаемый тип, указанный в тесте, стимулировал разработку (что для меня имеет смысл).

Данный модульный тест с неявной типизацией может выглядеть следующим образом:

public void Test_SomeMethod()
{
    MyClass myClass = new MyClass();

    var result = myClass.MethodUnderTest();
    Assert.AreEqual(someCondition, result);
}

Итак, мои вопросы таковы:

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

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

Это было полезно?

Решение

Я понимаю его точку зрения, но на самом деле я не думаю, что это правильная причина, чтобы не использовать var вот.Помните, TDD работает примерно в соответствии со следующим:

  1. Напишите новый тест.
  2. Если тест не удается скомпилировать (а он должен завершиться неудачей!), напишите достаточно кода до тех пор, пока тест не будет скомпилирован.
  3. Запустите все тесты.
  4. Если тест завершается неудачей, напишите достаточное количество кода до тех пор, пока все тесты не будут пройдены.
  5. Рефакторинг.

Независимо от того, используем мы или нет var тест не сможет скомпилироваться в любом случае, потому что тестируемый метод еще не будет существовать!.Как только мы начнем кодировать NewMethod его доводы довольно спорны.

Скорее, правильная причина не использовать var здесь потому, что код не дает никаких указаний на то, какой тип result есть.Это вопрос мнения, но var здесь все в порядке

var dict = new Dictionary<Foo, List<Bar>>();

и для анонимных типов, но не здесь

var m = M();

потому что это совершенно непонятно, не переходя к объявлению M (или используя IntelliSense) какой возвращаемый тип M есть.

Другие советы

Да и Нет

В настоящее время в Visual Studio TDD представляет собой небольшую проблему, особенно при использовании неявной типизации. var означает отсутствие intellisense, тогда, когда вы вводите имя типа, который, возможно, еще не существует, он имеет тенденцию к автозаполнению чем-то похожим на то, что вы вводите, часто именем тестового устройства.

Visual Studio 2010 имеет потребляйте первый режим, что делает его идеальным и улучшенным для разработки, основанной на тестировании.В настоящее время вы обнаружите (в 2008 году и ранее), что вам нужно нажать побег чтобы скрыть intellisense.

Что касается использования var это чисто синтетический сахар.На мой взгляд, это делает следующее намного приятнее:

var type = new MyType();

Ясно, что переменный тип имеет тип MyType. var отлично подходит для дженериков и соответствует принципу DRY - Не Повторяйся.

var type = MethodCall();

var result = ReturnResult();

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

С точки зрения инструментов, я бы сказал, что лучше избегать var.Я использую Eclipse и Java, но я знаю, что такие расширения, как CodeRush и Resharper, предлагают многие функции, которые я здесь обсуждаю.Когда в моем тесте я вызываю метод, который еще не существует, я могу "быстро исправить" это, чтобы создать метод в нужном классе.Тип возвращаемого значения автоматически созданного метода зависит от его контекста;если я ожидаю получить обратно строку, то возвращаемым типом метода будет String .Но если присвоение относится к var (которого нет в Java, но если бы это было так), IDE не знала бы достаточно, чтобы ввести возвращаемый тип, отличный от var (или, возможно, Object).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top