一次测试后,夹具的参考值会消失

时间:2017-02-03 15:37:13

标签: php doctrine-orm phpunit

在我的LoadFixture.php中,我添加了对我所有灯具的引用:

public function load(ObjectManager $manager) {
    $user = new user("Dummy");
    $this->persist($user);
    $this->addReference("user", $user);
}

在我的测试类中,我像这样加载它们:

public function setUp() {
        if(self::$do_setup){
            $this->loadFixtures(array(
                "Bundle\\Tests\\Fixtures\\LoadUser"
            )) ;
        }
}

在我的测试中,我使用它们:

public function testOne() {
    $client = $this->createClient($this->getReference("user_a"));
    $client->request('GET', '/');
    $this->assertStatusCode(200, $client);
    self::$do_setup=false;
}

public function testTwo() {
    $client = $this->createClient($this->getReference("user_a"));
    $client->request('GET', '/home');
    $this->assertStatusCode(200, $client);
}

从技术上讲,我不需要为每个测试使用setUp(),因此如果需要,我会使用$do_setupif来执行setUp

但如果我不执行setUp()中的testTwo,而我的数据库在我的数据库中,$this->getReference("user_a")会给我一个错误:

Call to a member function getReferenceRepository() on a non-object

我该如何解决?

更新
我找到了解决方案。所以我在这里发布,以防有​​人遇到与我相同的问题。 非常感谢@Damien Flament的回答,关于TestCase在每次测试后被删除的事实。

我将setUp()方法的名称更改为open(),将tearDown()方法的名称更改为close()。 该类的第一个方法调用open()方法,现在返回$this。 下一个方法是注释@depends testOne并获取参数。 使用此参数,我可以再次使用我的引用。 例如:

// new setUp Metod
public function open() {
        if(self::$do_setup){
            $this->loadFixtures(array(
                "Bundle\\Tests\\Fixtures\\LoadUser"
            )) ;
        }
}
//new tearDown method
public function close() {
   $this->getContainer()->get('doctrine.orm.entity_manager')->getConnection()->close();
}
public function testOne() {
    $this->open();
    $client = $this->createClient($this->getReference("user_a"));
    $client->request('GET', '/');
    $this->assertStatusCode(200, $client);
    return $this;
}
/**
 * @depends testOne
 */
public function testTwo($it) {
    $client = $this->createClient($it->getReference("user_a"));
    $client->request('GET', '/home');
    $this->assertStatusCode(200, $client);
    return $it;
}
/**
 * @depends testTwo
 */
public function testThree($it) {
    $client = $this->createClient($it->getReference("user_a"));
    $client->request('GET', '/about');
    $this->assertStatusCode(200, $client);
    $this->close();
}

1 个答案:

答案 0 :(得分:1)

我认为 TestCase 对象被PHPUnit删除并重新创建(我没有阅读PHPUnit源代码,但我认为这是重置测试的更简单方法每个测试的环境。)

因此,您的对象(可能由测试类对象属性引用)可能是垃圾回收。

要为每个测试类设置一次fixture,请使用 TestCase :: setUpBeforeClass()方法。

请参阅documention on "Sharing fixtures"