Symfony会话和phpunit故障
我的控制器中有如下代码:Symfony会话和phpunit故障,php,symfony,phpunit,Php,Symfony,Phpunit,我的控制器中有如下代码: /** * @param Request $request * @param $verifiedResponse * @Route(...) * @return mixed */ public function someAction(Request $request) { $session = $request->getSession(); $session->set('key', mt_rand(0, 999));
/**
* @param Request $request
* @param $verifiedResponse
* @Route(...)
* @return mixed
*/
public function someAction(Request $request)
{
$session = $request->getSession();
$session->set('key', mt_rand(0, 999));
if ($request->get('key') === $session->get('key')) {
return true;
} else {
return $session->get('key');
}
throw $this->createAccessDeniedException();
}
下面是我的两个单元测试:
public function testSomeActionFirst()
{
$client = static::createClient();
$client->request('POST', $this->generateRoute('my_route'));
return $client->getResponse()->getContent();
}
public function testSomeActionSecond($key)
{
$client = static::createClient();
$client->request('POST', $this->generateRoute('my_route'), [], [
'key' => $key
]);
$this->assertTrue($client->getResponse()->isOk()
}
第二个测试总是失败,因为响应代码是
403
,因为会话不会在请求之间保存。如何修复它?假设每个测试方法都在隔离中运行。否则您将遇到难以调试的问题,因为一个测试会影响其他测试。单一测试失败将导致其他测试失败。这样的测试套件给您带来的价值很小,因为测试失败不会告诉您出了什么问题。
起初您可能没有意识到这是一个问题,但维护这样的测试套件很快就会变得非常困难
因此,您应该能够分别运行每个测试
您还应该能够以任何顺序运行测试
您在测试中使用的web客户端已经遵循这些规则,并且在运行每个测试方法之前都会被重置。尽管从技术上讲,这是可能的,但即使采用这种方法,客户机也会被重置。这是件好事
如果您需要在每个测试用例中执行一些常见操作,请创建将封装(并命名!)该行为的帮助器方法。例如:
MyTest类扩展了WebTestCase
{
私人客户;
受保护的函数设置()
{
父::设置();
$this->client=static::createClient();
}
公共函数testSomeActionSecond()
{
$key=$this->requestKey();
$this->client->request(
"岗位",,
$this->generaterout(“我的路线”),
[],
['key'=>$key]
);
$this->assertTrue($this->client->getResponse()->isOk()
}
私有函数requestKey()
{
$this->client->request('POST',$this->generaterout('my_route');
返回$this->client->getResponse()->getContent();
}
}
假设每个测试方法都是在隔离状态下运行的。否则您会遇到难以调试的问题,因为一个测试会影响其他测试。单个测试失败会导致其他测试失败。这样的测试套件给您带来的价值很小,因为失败的测试不会告诉您出了什么问题。 起初您可能没有意识到这是一个问题,但维护这样的测试套件很快就会变得非常困难 因此,您应该能够分别运行每个测试 您还应该能够以任何顺序运行测试 您在测试中使用的web客户端已经遵循了这些规则,并且在运行每个测试方法之前都会被重置。虽然从技术上讲可以重置,但即使使用这种方法,客户端也会被重置。这是一件好事 如果您需要在每个测试用例中执行一些常见操作,请创建将封装(并命名!)该行为的帮助器方法。例如: MyTest类扩展了WebTestCase { 私人客户; 受保护的函数设置() { 父::设置(); $this->client=static::createClient(); } 公共函数testSomeActionSecond() { $key=$this->requestKey(); $this->client->request( "岗位",, $this->generaterout(“我的路线”), [], ['key'=>$key] ); $this->assertTrue($this->client->getResponse()->isOk() } 私有函数requestKey() { $this->client->request('POST',$this->generaterout('my_route'); 返回$this->client->getResponse()->getContent(); } }
您应该在同一测试方法内进行两次连续调用您应该在同一测试方法内进行两次连续调用