2013-04-15 71 views
0

我有一个关于PHPUnit的问题,以及它如何锁定对象,以及我是否以不正确的方式测试,或者它是否仅仅是PHPUnit中的某个东西。这是我的测试代码PHPUnit锁定对象

$t = Track::create(array('name'=>'test track')); 
$this->assertEquals(0, $t->student_tracks, 'Empty track should be empty'); 
$st = StudentTrack::create(array('track_id' => $t->id, 'completion'=>'0')); //Add item 
$this->assertEquals(1, $t->student_tracks, 'There should now be something in this track'); 

最后一个断言失败。数据库中的所有内容看起来都正确,如果我print_r两个对象($ t和$ st),它都会显示正确的信息。寻找到这些问题后,我发现,如果我在第一个断言前添加克隆它的工作原理:

$t = Track::create(array('name'=>'test track')); 
$cl = clone $t; 
$this->assertEquals(0, $cl->student_tracks, 'Empty track should be empty'); 
$st = StudentTrack::create(array('track_id' => $t->id, 'completion'=>'0')); //Add item 
$this->assertEquals(1, $t->student_tracks, 'There should now be something in this track'); 

所以我的问题是:

  1. 是否PHPUnit的锁定对象等以后我不能用它一个断言?

  2. 我测试错了,我应该每个测试只有一个断言?

在此先感谢。

+0

可以在测试中有多个断言,但我认为你的问题更多的是你期望$ t对象被修改,但StudentTrack工厂方法没有通过$ t,所以它不太可能修改它。 –

回答

1

PHPUnit是否锁定对象,所以我不能在断言后使用它?

不.PHPUnit在这方面没有做任何事情。

我是否测试错误,我应该每个测试只有一个断言?

您可能测试错误,但不是因为断言的数量。每次测试可以有多个断言,但实际上,在你的情况下,这有点像你想要使用Data Provider

class DataTest extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @dataProvider provider 
    */ 
    public function testStudentTracks($track, $expected, $message) 
    { 
     $this->assertEquals($expected, $track->student_tracks, $message); 
    } 

    public function provider() 
    { 
     return array(
      array(TrackTestCreator::createWithNoStudenTracks(), 0, 'Empty track should be empty'), 
      array(TrackTestCreator::createWithOneStudenTracks(), 1, 'There should now be something in this track'), 
     ); 
    } 
} 

测试中的一个关键点是让它们保持简单。例如。很可能你在创建对象时发生错误,所以你测试了一些你可能期望的东西,但是你不知道它是什么。因此测试失败。然后你感到困惑。

这就是为什么在我给出的例子中,我创建了两个更全局的函数来说明它们返回的结果。你需要实现它们中的每一个,如果你这样做是孤立的,你很可能找到错误。