Тестирование данных прибора - PullRequest
0 голосов
/ 25 ноября 2010

Я недавно начал использовать модульные тесты, и до сих пор это был взрыв.

Однако я столкнулся с ситуацией, когда мой подход кажется мне неправильным, и я не могу обернуть голову вокруг «хорошего» решения.

Контекстом для кода является приложение для просмотра расписаний телевизионного вещания, написанных на symfony, протестированное с помощью sfPHPUnit2Plugin.

public function testLoadChannelBroadcasts() {

    $Start = new DateTime();
    $End = new DateTime();

    $Channels = ChannelTable::getChannelsWithBroadcastsTouchingTimeSpan($Start, $End);

    foreach ($Channels as $Channel) {
      $Channel->loadBroadcastsTouchingTimeSpan($Start, $End);
    }

    // test data

    $Broadcasts = $Channels[0]->Broadcasts;

    $assertion = $Broadcasts[0]->getDateTimeObject('start') <= $Start
     && $Broadcasts[0]->getDateTimeObject('end') >= $Start;

    $this->assertTrue($assertion, 'starts before scope, ends inside scope');

    $assertion = $Broadcasts[1]->getDateTimeObject('start') >= $Start
     && $Broadcasts[1]->getDateTimeObject('end') <= $End;

    $this->assertTrue($assertion, 'starts inside scope, ends inside scope');

    $assertion = $Broadcasts[2]->getDateTimeObject('start') >= $Start
     && $Broadcasts[2]->getDateTimeObject('end') >= $End;

    $this->assertTrue($assertion, 'starts inside scope, ends outside scope');

    $LongBroadcast = $Channels[1]->Broadcasts[0];

    $assertion = $LongBroadcast->getDateTimeObject('start') <= $Start
     && $LongBroadcast->getDateTimeObject('end') >= $End;

    $this->assertTrue($assertion, 'starts before scope, ends after scope');
}

Тест сообщает цель метода, но тестирование данных (фикстур) в значительной степени зависит от предположений о том, что эти данные содержат. Есть ли лучший подход к этому?

1 Ответ

0 голосов
/ 25 ноября 2010

Это на самом деле не модульный тест , как сейчас, потому что вы тестируете метод за его пределами, вызывая ChannelTable.

Правильный способ сделать это - изменить:

$Channels = ChannelTable::getChannelsWithBroadcastsTouchingTimeSpan($Start, $End);

Кому:

$Channels = array('yourdata', 'etc');

Таким образом, если ChannelTable не сможет предоставить правильные данные, ваш тест не пройдет, потому что он не должен.

Помните, что целью модульного тестирования является проверка модуля (метода) и ничего больше. Если все ваше приложение не может подключиться к базе данных и предоставить данные, модульное тестирование все еще проходит, потому что метод ведет себя как следует.

...