测试夹具数据

时间:2010-11-25 20:04:23

标签: php unit-testing symfony1 phpunit

我最近开始使用单元测试,到目前为止已经爆炸了。

然而,我遇到了一种情况,我的方法感觉完全错误,我无法围绕“好”的解决方案。

代码的上下文是用于查看用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 :(得分:0)

这实际上不是单元测试,因为您正在通过调用ChannelTable来测试其边界之外的方法。

这样做的正确方法是改变:

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

要:

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

这样,如果ChannelTable无法提供正确的数据,那么您的测试不会失败,因为它不会失败。

请记住,单元测试的目的是测试单元(方法)而不是其他任何东西。如果您的整个应用程序无法连接到数据库并提供数据,则单元测试仍会通过,因为该方法的行为应该如此。