在我的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_setup
和if
来执行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();
}
答案 0 :(得分:1)
我认为 TestCase 对象被PHPUnit删除并重新创建(我没有阅读PHPUnit源代码,但我认为这是重置测试的更简单方法每个测试的环境。)
因此,您的对象(可能由测试类对象属性引用)可能是垃圾回收。
要为每个测试类设置一次fixture,请使用 TestCase :: setUpBeforeClass()方法。