Как проверить, что поле является строкой - PullRequest
0 голосов
/ 25 марта 2010

Это я возвращаюсь к основам TDD в учебных целях.

Я изначально реализовал Person.Surname как поле типа объекта (самый простой способ пройти тест.

Затем я добавил тестовую настройку Person.Surname, утверждающую, что возвращаемое значение должно быть строкой, и установил Person.Surname=20.

Я «исправил» тест, изменив реализацию на использование string вместо object. Тест теперь долго компилируется из-за статической проверки типов, поэтому я закомментировал его.

Person.Surname поле в настоящее время реализовано в виде строки. Если я изменю реализацию поля на объект, ни один из моих тестов не пройдёт.

Так что я не могу оставить свое намерение в тесте. Есть ли способ пройти неудачный тест в этих обстоятельствах?


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

Ответы [ 4 ]

5 голосов
/ 25 марта 2010

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

При рефакторинге производственного кода время от времени это влияет и на тестовый код, и вам необходимо обновить тесты, чтобы они компилировались и проходили (тестовый код требует рефакторинга так же, как и весь другой код). Когда это происходит, полезно, чтобы название теста указывало на то, что было целью теста - какая особенность / поведение определяется тестом. Затем вы можете обновить тестовый код, чтобы сохранить то же самое намерение. Или, если причина написания тестов больше не действительна, вы можете удалить тест.

1 голос
/ 25 марта 2010
Assert.IsInstanceOfType(Person.Surname, typeof(string));
0 голосов
/ 25 марта 2010

Вы можете использовать оператор is ....

if ( Person.Surname is string )
{
    // do stuff
}

Вы также можете использовать в качестве оператора ...

string surname = Person.Surname as string;
if ( surname != null ) // as succeded
{
    // do stuff
}
0 голосов
/ 25 марта 2010

Не могли бы вы добавить чек, как:

Assert.AreEqual( typeof(string), Person.Surname.GetType() );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...