Как тестировать абстрактные классы - PullRequest
35 голосов
/ 01 ноября 2011

Использовал инструмент создания модульных тестов в Visual Studio и, очевидно, пытается создать мои абстрактные классы.

У меня вопрос: должен ли я попытаться выполнить модульное тестирование, как Visual Studio пытается заставить меня это сделать, или я должен создать фиктивный класс для создания экземпляра, или я должен только тестировать методы, которые используют этот абстрактный класс?

Спасибо.

Ответы [ 4 ]

57 голосов
/ 01 ноября 2011

Если в этом абстрактном классе есть методы, которые стоит протестировать, вам следует их протестировать.Вы всегда можете создать подкласс абстрактного класса для теста (и назвать его как MyAbstractClassTesting) и протестировать этот новый конкретный класс.

24 голосов
/ 01 ноября 2011

Есть две противоположные точки зрения:

  • Не тестируйте сам абстрактный класс, тестируйте конкретные классы, унаследованные от него
  • Абстрактный класс также должен быть протестирован, поскольку предоставляет некоторые встроенныев логике, общей для всех унаследованных классов, так что вы просто один раз тестируете базовую логику в абстрактном классе

Я предпочитаю второй вариант (в настоящее время) и тестирую абстрактные классы, используя RhinoMocks PartialMock , которая позволяетмне создать макет абстрактного класса.

5 голосов
/ 01 ноября 2011
  1. Просто протестируйте реализующие классы.

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

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

0 голосов
/ 01 сентября 2018

использование из mockrepository:

[testmethod]
       public void testwithmockrepository()
       {
           var mockrepository = new rhino.mocks.mockrepository();
           var mock = mockrepository.partialmock<myabstractclass>();

           using ( mockrepository.record() )
           {
               expect.call( mock.dosomething( arg<string>.is.anything ) ).return( "hi..." ).repeat.once();
           }
           using ( mockrepository.playback() )
           {
               assert.areequal( "hi..." , mock.dosomething( "salam" ) );
           }
       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...