Symfony/phpUnit:表单修改实体的功能测试



如何对绑定到实体的表单进行功能测试(而不是单元测试)?

上下文

假设你有一个实体"Car",有一个字段"id"和另一个字段"numberPlate",还有一个编辑汽车数据的页面。

CarController.php:

//...
public function imsiDetailsChangeAction(Request $request)
{
$car_id = $request->get('car_id');
$car = $this->getDoctrine()->getRepository('ClnGsmBundle:Car')->Find($car_id);
if ($simCard != null)
{
$form = $this->createForm(new CarType()), $car);
if($request->isMethod('POST'))
{
$form->bind($request);
if ($form->isValid())
{
$em = $this->getDoctrine()->getManager();
$em->flush();
return $this->redirect($this->generateUrl('car_view', array('car_id' => $car->getId())));
}
}
}
else
{
throw new NotFoundHttpException();
}
return $this->render('SiteBundle:Car:carEdit.html.twig', array('car' => $car, 'form' => $form->createView()));
}
//...

我想要什么

使用phpUnit进行以下测试:

  • 创建一个带有车牌"QWE-456"的汽车实体

  • 用表单加载页面

  • 使用爬网程序,将表单中的车牌替换为"AZE-123",并提交表单

  • 断言我的汽车实体的车牌现在等于"AZE-123">

我尝试了什么

(以防万一:我自己的代码有点不同,下面是我对汽车示例的处理)

CarControllerTest.php:

//...
public function SetUp()
{
//start kernel, stores entity manager in $this->em and client in $this->client
}
//...
public function testEditForm()
{
$car = new Car();
$car->setNumberPlate("QWE-456");
$this->entityManager->persist($simCard);
$this->em->flush();
$crawler = $this->client->request('GET', '/fr/Car/edit/'.$car->getId());
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$formNode = $crawler->filterXpath("//div[@id='main']//form");
$form = $formNode->form(array(
'car[plateNumber]'=>'AZE-123',
));
//var_dump($car->getPlateNumber());
$this->client->submit($form);
//var_dump($car->getPlateNumber());
$this->assertEquals('AZE-123',$car->getPlateNumber);
}

我希望这个测试能够通过,第二个var_dump将打印"AZE-123"而不是"QWE-456"。但我的实体没有被修改。

我该怎么做?

您应该刷新从数据库重新加载的数据:刷新方法为您完成这项工作,所以请尝试以下操作:

$this->client->submit($form);
$this->em->refresh($car);
$this->assertEquals('AZE-123',$car->getPlateNumber);

我建议您在HTTP响应之前进行检查,以验证正确的交互,例如:

$response = $this->client->getResponse();
$this->assertTrue($response->isRedirection());

希望这能帮助

最新更新