我最近开始使用单元测试,到目前为止已经爆炸了。
然而,我遇到了一种情况,我的方法感觉完全错误,我无法围绕“好”的解决方案。
代码的上下文是用于查看用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');
}
测试传达了方法的目的,但数据测试(夹具)在很大程度上依赖于数据所包含的假设。有更好的方法吗?
答案 0 :(得分:0)
这实际上不是单元测试,因为您正在通过调用ChannelTable
来测试其边界之外的方法。
这样做的正确方法是改变:
$Channels = ChannelTable::getChannelsWithBroadcastsTouchingTimeSpan($Start, $End);
要:
$Channels = array('yourdata', 'etc');
这样,如果ChannelTable
无法提供正确的数据,那么您的测试不会失败,因为它不会失败。
请记住,单元测试的目的是测试单元(方法)而不是其他任何东西。如果您的整个应用程序无法连接到数据库并提供数据,则单元测试仍会通过,因为该方法的行为应该如此。