【问题标题】:Symfony / phpUnit : functional test of a form modifying an entitySymfony / phpUnit:修改实体的表单的功能测试
【发布时间】:2018-03-18 11:41:42
【问题描述】:

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

上下文

假设您有一个实体“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”创建汽车实体

  • 使用表单加载页面

  • 使用爬虫,将表单中的numberPlate替换为“AZE-123”,并提交表单

  • 断言我的汽车实体的 numberPlate 现在等于“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”。但我的实体没有被修改。

我应该怎么做?

【问题讨论】:

    标签: php symfony doctrine-orm phpunit


    【解决方案1】:

    您应该刷新从数据库中重新加载的数据:refresh method 为您执行此操作,所以试试这个:

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

    我建议你在 HTTP Response 之前检查以验证正确的交互,例如:

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

    希望有帮助

    【讨论】:

    • 非常感谢您的回答,很抱歉没有尽快进行测试!我不知道这种方法,但我应该知道数据库中的元组在没有更新我的实体的情况下被修改了......但是,这个解决方案仍然不起作用,因为“SQLSTATE [HY000]:一般错误:1没有这样表:汽车”。我认为这是因为内核再次启动并且数据库被划伤(在一次测试中尝试执行多个请求时我遇到了类似的错误)。你不应该这样做吗?我是否应该像我在此处的几个答案中看到的那样覆盖默认客户端来更改此行为?
    • (我指的是这个:alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests 在这里找到:stackoverflow.com/questions/12823021/…(刚才我看到我的问题与这个重复......))
    • 测试数据库创建成功了吗?如果您登录到测试数据库,您会看到相关表吗?
    • 我认为用于测试的数据库是 SQLlite 数据库?我测试了覆盖客户端以允许其他请求而不重新启动内核(在此处跳过第 99 行 github.com/symfony/symfony/blob/2.3/src/Symfony/Bundle/… ,在需要时直接执行 github.com/symfony/symfony/blob/2.3/src/Symfony/Component/… 的 doRequest )并且它就是这样工作的!此外,甚至不需要刷新方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2019-01-14
    • 2015-01-31
    • 2015-04-26
    • 2011-01-19
    • 2015-10-29
    • 2017-08-16
    相关资源
    最近更新 更多