0

我有一个关于 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. 我测试错了吗,每次测试我应该只有一个断言吗?

提前致谢。

4

1 回答 1

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'),
        );
    }
}

测试的一个关键点是让它们保持简单。例如,您很可能在创建对象时出错,因此您测试了一些您可能期望但您不知道的东西。因此测试失败。那你就纳闷了。

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

于 2013-04-15T22:20:06.303 回答