symfony2 ведет себя в тестовой среде: таблицы БД не созданы

Я пытаюсь работать со своим приложением, и у меня есть большая проблема; Таблицы БД не создаются, поэтому никакие фикстуры поставить не могу.

Мой сценарий:

  Scenario: Check the stories page
    Given Database is set
      And I am logged as "admin" and password "123123123"
      And print last response
      ...

Часть FeatureContext:

/**
 * @Given /^Database is set$/
 */
public function databaseIsSet()
{
    $this->generateSchema() ;
    $admin = new User() ;
    $admin->setRoles(array(User::ROLE_SUPER_ADMIN)) ;
    $admin->setEnabled(true) ;
    $admin->setUsername("admin") ;
    $admin->setPlainPassword("123123123") ;
    $admin->setEmail("[email protected]") ;
    $em = $this->getEntityManager() ;
    $em->persist($admin) ;
    $em->flush() ;
            echo $admin->getId() . "==" ;
    echo "db set" ;
}
/**
 * @Given /^I am logged as "([^"]*)" and password "([^"]*)"$/
 */
public function iAmLoggedAsAndPassword($username, $password)
{
    return array(
        new Step\When('I am on "/login"'),
        new Step\When('I fill in "username" with "' . $username . '"'),
        new Step\When('I fill in "password" with "' . $password . '"'),
        new Step\When('I press "Login"'),
    );
}
protected function generateSchema()
{
    // Get the metadatas of the application to create the schema.
    $metadatas = $this->getMetadatas();

    if ( ! empty($metadatas)) {
        /**
        * @var \Doctrine\ORM\Tools\SchemaTool
        */
        $tool = new SchemaTool($this->getEntityManager());
//            $tool->dropDatabase() ;
        $tool->createSchema($metadatas);
    } else {
        throw new Doctrine\DBAL\Schema\SchemaException('No Metadata Classes to process.');
    }
}

/**
 * Overwrite this method to get specific metadatas.
 *
 * @return Array
 */
protected function getMetadatas()
{
    $result = $this->getEntityManager()->getMetadataFactory()->getAllMetadata() ;return $result;
}

protected function getEntityManager()
{
    return $this->kernel->getContainer()->get("doctrine")->getEntityManager() ;
}
 ....

Код для generateSchema взят где-то из Интернета и используется в тестах Phpunits, которые у меня есть, и работает отлично.

Но; когда я запускаю bin/behat, я получаю

 SQLSTATE[HY000]: General error: 1 no such table: tbl_user

после входа в систему часть сценария.

Оператор echo, который у меня есть, также отображается в выводе, просто чтобы убедиться, что метод действительно выполняется. Кроме того, $admin получает идентификатор 1, который также виден в выводе.

В моей тестовой среде используется база данных sqlite по умолчанию, и не имеет значения, поставлю ли я 'http://mysite.local/app_dev.php/' или 'http://mysite.local/app_test.php/' для base_url в конфигурации; логин не работает, хотя я скопировал и вставил его со страницы knpLabs. Чтобы убедиться, что $admin все еще находится в БД, я попытался перезагрузить его из репозитория, и он работает (я удалил эту часть кода).

Помощь?


person Zeljko    schedule 20.01.2013    source источник


Ответы (2)


Собственно, я нашел проблему. Sqlite работает в памяти, и при каждом запросе на какую-либо страницу, например login url, предыдущее состояние терялось. Я создал новую среду app_behat.php с этими настройками в config_behat.yml:

imports:
  - { resource: config.yml }

framework:
  test: ~
  session:
    storage_id: session.storage.mock_file

doctrine:
  dbal:
    dbname:   other_database

и это работает сейчас. Может быть, кто-то найдет это полезным.

person Zeljko    schedule 20.01.2013

У меня была такая же проблема, и для меня проблема была в файле config_test.yml.

Я изменил pdo_sqlite на pdo_mysql.

doctrine:
    dbal:
        driver: pdo_mysql
#        driver:   pdo_sqlite

И это работает как шарм.

person Vincent Moulene    schedule 23.04.2019