Spec-Zone.ru › Codeception

Doctrine2

Установка

Если вы используете Codeception, установленный с помощью Composer, установите этот модуль следующей командой:

composer require --dev codeception/module-doctrine2

В качестве альтернативы, вы можете включить Doctrine2 модуль в файле конфигурации набора и выполнить

codecept init upgrade4

Этот модуль был включён в Codeception 2 и 3, но с версии 4 его необходимо устанавливать отдельно.
Некоторые модули включены в файлы PHAR.
Предупреждение. Использование файла PHAR и Composer в одном проекте может привести к непредвиденным ошибкам.

Описание

Доступ к базе данных с использованием Doctrine2 ORM.

При использовании с Symfony или Zend Framework 2 менеджер сущностей Doctrine автоматически извлекается из локатора сервисов. Настройте ваш functional.suite.yml следующим образом:

modules:
    enabled:
        - Symfony # 'ZF2' or 'Symfony'
        - Doctrine2:
            depends: Symfony
            cleanup: true # All doctrine queries will be wrapped in a transaction, which will be rolled back at the end of each test

Если вы не используете Symfony или Zend Framework, вам нужно указать функцию обратного вызова для извлечения менеджера сущностей:

modules:
    enabled:
        - Doctrine2:
            connection_callback: ['MyDb', 'createEntityManager'] # Call the static method `MyDb::createEntityManager()` to get the Entity Manager

По умолчанию, модуль будет оборачивать все в транзакцию для каждого теста и откатывать её после этого (это регулируется настройкой cleanup). Благодаря этому тесты будут выполняться намного быстрее и будут изолированы друг от друга.

Для использования модуля Doctrine2 в приёмочных тестах настройте ваш acceptance.suite.yml следующим образом:

modules:
    enabled:
        - Symfony:
            part: SERVICES
        - Doctrine2:
            depends: Symfony

Вы не можете использовать cleanup: true в приёмочном тесте, так как Codeception и ваше приложение (т. е. браузер) используют два разных подключения к базе данных, поэтому Codeception не может обернуть изменения, внесённые приложением, в транзакцию.

Изменение режима очистки фикстур Doctrine:

modules:
    enabled:
        - Doctrine2:
            purge_mode: 1 //1 - DELETE, 2 - TRUNCATE, default DELETE

Статус

  • Поддерживает: davert
  • Устойчивость: стабильная
  • Контакт: codecept@davert.mail.ua

Конфигурация

Открытые свойства

  • em - Менеджер сущностей

Примечание о параметрах

Каждый метод, ожидающий параметров для проверки значений в базе данных (see...(), dontSee...(), grab...()), может принимать экземпляр \Doctrine\Common\Collections\Criteria для большей гибкости, например:

$I->seeInRepository(User::class, [
    'name' => 'John',
    Criteria::create()->where(
        Criteria::expr()->endsWith('email', '@domain.com')
    ),
]);

Если критерии — это просто ->where(...) конструкция, вы можете передать просто выражение без обертки критерии:

$I->seeInRepository(User::class, [
    'name' => 'John',
    Criteria::expr()->endsWith('email', '@domain.com'),
]);

Критерии можно использовать не только для фильтрации данных, но и для изменения порядка результатов:

$I->grabEntitiesFromRepository('User', [
    'status' => 'active',
    Criteria::create()->orderBy(['name' => 'asc']),
]);

Обратите внимание, что ключ игнорируется, так как фактическое имя поля является частью критериев и/или выражения.

Действия

clearEntityManager

Выполняет $em->clear():

$I->clearEntityManager();

dontSeeInRepository

Очищает изменения в базе данных и выполняет findOneBy() вызов для текущего репозитория.

  • param $entity
  • param array $params

flushToDatabase

Выполняет $em->flush();

grabEntitiesFromRepository

Выбирает сущности из репозитория. Он строит запрос на основе массива параметров. Вы можете использовать ассоциации сущностей для построения сложных запросов.

Пример:

<?php
$users = $I->grabEntitiesFromRepository(User::class, ['name' => 'davert']);
?>
  • Available since 1.1
  • param $entity
  • param array $params. Для IS NULL, используйте ['field' => null]
  • return array

grabEntityFromRepository

Выбирает одну сущность из репозитория. Он строит запрос на основе массива параметров. Вы можете использовать ассоциации сущностей для построения сложных запросов.

Пример:

<?php
$user = $I->grabEntityFromRepository(User::class, ['id' => '1234']);
?>
  • Available since 1.1
  • param $entity
  • param array $params. Для IS NULL, используйте ['field' => null]
  • return object

grabFromRepository

Выбирает значение поля из репозитория. Он строит запрос на основе массива параметров. Вы можете использовать ассоциации сущностей для построения сложных запросов.

Пример:

<?php
$email = $I->grabFromRepository(User::class, 'email', ['name' => 'davert']);
?>
  • Available since 1.1
  • param $entity
  • param $field
  • param array $params

haveFakeRepository

Мокирует репозиторий.

С помощью этого действия вы можете переопределить любой метод любого репозитория. Обратите внимание: эти фейковые репозитории будут доступны через менеджер сущностей до конца теста.

Пример:

<?php

$I->haveFakeRepository(User::class, ['findByUsername' => function($username) { return null; }]);

Это создаёт заглушку класса для репозитория Entity\User с переопределённым методом findByUsername, который всегда возвращает значение NULL.

  • param $classname
  • param array $methods

haveInRepository

Сохраняет запись в репозиторий. Этот метод создаёт сущность и устанавливает её свойства непосредственно (через рефлексию). Сеттеры сущности не будут выполнены, но вы можете создать практически любую сущность и сохранить её в базе данных. Если сущность имеет конструктор, для необязательных параметров будет использовано значение по умолчанию, а для необязательных параметров — заданные поля (с соответствующим именем) будут переданы при вызове конструктора перед непосредственным установлением свойств (через рефлексию).

Возвращает первичный ключ новосозданной сущности. Значение первичного ключа извлекается с помощью API рефлексии. Если первичный ключ составной, возвращается массив значений.

$I->haveInRepository(User::class, ['name' => 'davert']);

Этот метод также принимает экземпляры в качестве первого аргумента, что полезно, когда конструктор сущности имеет некоторые аргументы:

$I->haveInRepository(new User($arg), ['name' => 'davert']);

В качестве альтернативы аргументы конструктора можно передавать по имени. Учитывая подпись конструктора User — __constructor($arg), приведенный выше пример можно переписать следующим образом:

$I->haveInRepository(User::class, ['arg' => $arg, 'name' => 'davert']);

Если сущность имеет отношения, они также могут быть заполнены. В случае OneToMany ожидается следующий формат:

$I->haveInRepository(User::class, [
    'name' => 'davert',
    'posts' => [
        ['title' => 'Post 1'],
        ['title' => 'Post 2'],
    ],
]);

Для ManyToOne формат немного отличается:

$I->haveInRepository(User::class, [
    'name' => 'davert',
    'post' => [
        'title' => 'Post 1',
    ],
]);

Это работает рекурсивно, поэтому вы можете создавать глубокие структуры в одном вызове.

Обратите внимание, что $em->persist(), $em->refresh(), и $em->flush() вызываются каждый раз.

  • param string|object $classNameOrInstance
  • param array $data

loadFixtures

Загружает фикстуры. Фикстура может быть указана как полное имя класса, экземпляр или массив имён/экземпляров классов.

<?php
$I->loadFixtures(AppFixtures::class);
$I->loadFixtures([AppFixtures1::class, AppFixtures2::class]);
$I->loadFixtures(new AppFixtures);

По умолчанию фикстуры загружаются в режиме «добавление». Для замены всех данных в базе данных используйте false в качестве второго параметра:

<?php
$I->loadFixtures(AppFixtures::class, false);

Этот метод требует, чтобы doctrine/data-fixtures был установлен.

  • param string|string[]|object[] $fixtures
  • param bool $append @throws ModuleException @throws ModuleRequireException

onReconfigure

HOOK, который выполняется при изменении конфигурации с _reconfigure.

persistEntity

Этот метод устарел в пользу haveInRepository(). Его функциональность точно такая же.

refreshEntities

Выполняет $em->refresh() для каждой переданной сущности:

$I->refreshEntities($user);
$I->refreshEntities([$post1, $post2, $post3]]);

Это может быть полезно в приёмочных тестах, где сущность может стать недействительной из-за внешних (относительно менеджера сущностей, используемого в тестах) изменений.

  • param object|object[] $entities

seeInRepository

Очищает изменения в базе данных и выполняет запрос с параметрами, определёнными в массиве. Вы можете использовать ассоциации сущностей для построения сложных запросов.

Пример:

<?php
$I->seeInRepository(User::class, ['name' => 'davert']);
$I->seeInRepository(User::class, ['name' => 'davert', 'Company' => ['name' => 'Codegyre']]);
$I->seeInRepository(Client::class, ['User' => ['Company' => ['name' => 'Codegyre']]]);
?>

Не удаётся, если запись для заданных критериев не найдена,

  • param $entity
  • param array $params

© 2011 Michael Bodnarchuk and contributors
Licensed under the MIT License.
https://codeception.com/docs/modules/Doctrine2

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API