2010-01-26 4 views
5

Я только что прочитал это post, и это делает случай против неявной типизации, когда вы начинаете с разработки/проектирования, основанного на тестах.Неявная типизация и TDD

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

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

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

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

Так что мои вопросы:

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

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

+0

@cmw - стоит отметить, что var все еще строго типизирован. То есть в вашем фрагменте кода myClass все еще имеет тип MyClass, и если вы попытаетесь обработать его по-другому, вы получите ошибки времени компиляции. Ваш другой комментарий заставлял меня думать, что может быть какая-то путаница в этом. – Finglas

+0

@ Dockers - изменил код, чтобы отразить ту часть, в которой я больше заинтересован. Меня больше беспокоит значение результата из MethodUnderTest(). – cmw

ответ

3

Я вижу его точку зрения, но я не думаю, что это правильная причина не использовать 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 есть.

+0

'SomeType m = M();' не обязательно является четким. 'm' - ужасное имя переменной. Если вы измените его на имя переменной * good *, вам все равно нужно будет увидеть тип? –

+0

Фактический тип должен быть важным. Это деталь реализации и должна в лучшем случае быть неизвестной в строке var m = M(); тип не имеет ничего общего с читабельностью кода. Однако имя переменной будет повторяться каждый раз, когда оно используется, и его следует выбирать осторожно. –

+0

Я тоже думал о тесте. Единичный тест, который не компилируется, по-прежнему является тестом. Но что касается неявной типизации, будет ли она помогать при тестировании возвращаемых результатов (которые, конечно, имеют описательные имена переменных)? Или должны быть явно введены результаты? – cmw

1

Да и Нет

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

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

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

var type = new MyType(); 

Его ясно, что тип переменной, имеет тип MyType. var отлично подходит для дженериков и следует за принтером DRY - Не повторяйте себя.

var type = MethodCall(); 

var result = ReturnResult(); 

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

+0

Почему вы думаете, что var type = MethodCall(); трудно читать? Какой тип 'type' должен обычно (по-моему) не важен для чтения кода (с другой стороны, следует изменить название переменной для повышения удобочитаемости) –

+0

Я добавил еще один пример. Результатом может быть что угодно, строка, int, другой объект и т. Д. Даже с разумным именем может возникнуть путаница. * var * является удивительным, но лучше не злоупотреблять им. – Finglas

0

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

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

+0

Иногда мне хотелось бы, чтобы VS2008 имел некоторые функции, которые делает Eclipse. :-) – cmw

+0

@cmw - загляните в CodeRush & Resharper; у них есть некоторые функции, которые даже пользователи Eclipse могут позавидовать. –

Смежные вопросы