使用DataFixtures在WebTestCase上的phpUnitTest之后的TearDown数据库

时间:2018-07-20 20:05:16

标签: php symfony testing phpunit symfony-3.4

我有以下phpUnit功能测试:

namespace Tests\AppBundle\Controller;

/**
* @testtype Functional
*/
class DefaultControllerTest extends BasicHttpController
{

    /**
    * {@inheritdoc}
    */
    public function setUp()
    {
        $client = static::createClient();
        $container = $client->getContainer();
        $doctrine = $container->get('doctrine');
        $entityManager = $doctrine->getManager();

        $fixture = new YourFixture();
        $fixture->load($entityManager);
    }

    /**
    * {@inheritdoc}
    */
    public function tearDown()
    {
        //Database is being destroyed here....
    }

    public function testIndex()
    {
        $client = static::createClient();

        $crawler = $client->request('GET', '/');
        $response=$client->getResponse();
        $this->assertEquals(302, $response->getStatusCode());
        $this->assertEquals('/login',$response->headers->get('Location'));

        //@todo Create Dummy Users
        $this->checkPanelAfterSucessfullLogin($crawler); //How I can create some user?
    }
}

如您所见,我加载了以下灯具:

namespace AppBundle\DataFixtures\Test;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\Common\Persistence\ObjectManager;

class DummyUserFixtures extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{

  /**
  * @var ContainerInterface
  */
  private $container=null;

  /**
  * Generic function that creates a user with provided information.
  * @param $name {String} The user's name
  * @param $surname {String} The user's surname
  * @param $username {String} The user's username
  * @param $password {String} The user's password
  * @param $email {String} The user's recovery email
  * @param $role {String} The user's system role
  * @param $phone {String | null} The user's phone number
  * @param $organization {String|null} The user's organization
  * @param $occupation {String|null} The user's occupation
  *
  * @return AppBundle\Entity\User
  */
  private function createUser($name,$surname,$username,$password,$email,$role,$phone=null,$organization=null,$occupation=null)
  {
    $fosUserManager=$this->container->get('fos_user.user_manager');
      /**
      * @var AppBundle\Entity\User
      */
      $user=$fosUserManager->createUser();
      $user->setUsername($username);
      $user->setEmail($email);
      $user->setPlainPassword($password);
      $user->setEnabled(true);
      $user->setRoles(array($role));

      $user->setName($name);
      $user->setSurname($surname);

      if($phone){
        $user->setPhone($phone);
      }

      if($organization){
        $user->setOrganization($organization);
      }

      if($occupation){
        $user->serOccupation($occupation);
      }

      $fosUserManager->updateUser($user, true);

      return $user;
  }

  public function setContainer(ContainerInterface $container = null)
  {
    $this->container = $container;
  }

  /**
  * {@inheritDoc}
  */
  public function load(ObjectManager $manager)
  {
    $this->createUser('John','Doe','jdoe','simplepasswd','jdoe@example.com','ROLE_USER','+3021456742324','Acme Products','Soft Engineer');
    $this->createUser('Jackie','Chan','jchan','thesimplepasswd','jackiechan@example.com','ROLE_ADMIN','+302141232324','Holywood','Actor');
    $this->createUser('Chuck','Norris','chuck_norris','unhackablepasswd','chucknorris@example.com','ROLE_SUPERADMIN',null,'Universe','Master');
  }

}

但是我希望能够在数据库更改发生之后能够完全拆除数据库并为下一次测试重新创建它。您是否知道如何彻底删除数据库?

1 个答案:

答案 0 :(得分:1)

在使用Doctrine DataFixtures时,可以在测试中实现以下逻辑:

<?php
namespace Tests\AppBundle\Controller;

Use Doctrine\Common\DataFixtures\Purger\ORMPurger;


/**
 * @testtype Functional
 */
class DefaultControllerTest extends BasicHttpController
{
    private $em;

    /**
     * {@inheritdoc}
     */
    public function setUp()
    {
        $client = static::createClient();
        $container = $client->getContainer();
        $doctrine = $container->get('doctrine');
        $this->em = $doctrine->getManager();

        $fixture = new YourFixture();
        $fixture->load($entityManager);
    }

    private function truncateEntities()
    {
        $purger = new ORMPurger($this->em);
        $purger->purge();
    }

    public function tearDown()
    {
        $this->truncateEntities(); 
    }

    // your tests
}