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 since1.1 -
param$entity -
param array$params. ДляIS NULL, используйте['field' => null] return array
grabEntityFromRepository
Выбирает одну сущность из репозитория. Он строит запрос на основе массива параметров. Вы можете использовать ассоциации сущностей для построения сложных запросов.
Пример:
<?php $user = $I->grabEntityFromRepository(User::class, ['id' => '1234']); ?>
-
Available since1.1 -
param$entity -
param array$params. ДляIS NULL, используйте['field' => null] return object
grabFromRepository
Выбирает значение поля из репозитория. Он строит запрос на основе массива параметров. Вы можете использовать ассоциации сущностей для построения сложных запросов.
Пример:
<?php $email = $I->grabFromRepository(User::class, 'email', ['name' => 'davert']); ?>
-
Available since1.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