Spec-Zone.ru › Codeception

DataFactory

Установка

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

composer require --dev codeception/module-datafactory

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

codecept init upgrade4

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

Описание

DataFactory позволяет легко генерировать и создавать тестовые данные, используя FactoryMuffin. DataFactory использует ORM вашего приложения для определения, сохранения и очистки данных. Поэтому его следует использовать с ORM или модулями Framework.

Для этого модуля требуются установленные пакеты:

{
 "league/factory-muffin": "^3.0",
}

Правила генерации могут быть определены в файле фабрик. Вам необходимо создать factories.php (рекомендуется хранить его в _support директории). Следуйте документации FactoryMuffin, чтобы установить допустимые правила. Случайные данные предоставляются библиотекой Faker.

<?php
use League\FactoryMuffin\Faker\Facade as Faker;

$fm->define(User::class)->setDefinitions([
 'name'   => Faker::name(),

    // generate email
   'email'  => Faker::email(),
   'body'   => Faker::text(),

   // generate a profile and return its Id
   'profile_id' => 'factory|Profile'
]);

Настройте этот модуль для загрузки определений фабрик из каталога. Вам также необходимо указать модуль с ORM в качестве зависимости.

modules:
    enabled:
        - Yii2:
            configFile: path/to/config.php
        - DataFactory:
            factories: tests/_support/factories
            depends: Yii2

(также можно использовать Laravel5 и Phalcon).

В этом примере фабрики загружаются из каталога tests/_support/factories. Обратите внимание, что этот каталог относительный к файлу codeception.yml (следовательно, для Yii2 это будет codeception/_support/factories). Вы должны создать этот каталог вручную и создать в нём PHP-файлы с определениями фабрик, следуя официальной документации.

В случаях, когда вы хотите использовать данные из базы данных внутри определений фабрики, вы можете определить их в Helper. Например, если вы используете Doctrine, это позволяет вам получить доступ к EntityManager внутри определения.

Чтобы продолжить, вам нужно создать помощник Factories с помощью команды generate:helper и включить его:

modules:
    enabled:
        - DataFactory:
            depends: Doctrine2
        - \Helper\Factories

В этом случае вы можете определять фабрики из класса Helper с помощью метода _define.

<?php
public function _beforeSuite()
{
     $factory = $this->getModule('DataFactory');
     // let us get EntityManager from Doctrine
     $em = $this->getModule('Doctrine2')->_getEntityManager();

     $factory->_define(User::class, [

         // generate random user name
         // use League\FactoryMuffin\Faker\Facade as Faker;
         'name' => Faker::name(),

         // get real company from database
         'company' => $em->getRepository(Company::class)->find(),

         // let's generate a profile for each created user
         // receive an entity and set it via `setProfile` method
         // UserProfile factory should be defined as well
         'profile' => 'entity|'.UserProfile::class
     ]);
}

Определения фабрик описаны в официальной документации Factory Muffin

Генераторы родственных моделей

Если ваш модуль опирается на другие модели, вы можете сгенерировать их обе. Для создания родственного модуля можно использовать либо factory или entity префикс, в зависимости от используемого ORM.

В случае, если ваш ORM ожидает установки Id связанной записи (Eloquent), используйте префикс factory:

'user_id' => 'factory|User'

Если ваш ORM ожидает саму связанную запись (Doctrine), то вы должны использовать префикс entity:

'user' => 'entity|User'

Настройка хранилища

Вы можете определить пользовательское хранилище для Factory Muffin, используя параметр customStore. Это может быть простой класс или фабрика с методом create. Созданный объект должен реализовывать \League\FactoryMuffin\Stores\StoreInterface.

Пример фабрики хранилища:

modules:
    enabled:
        - DataFactory:
            customStore: \common\tests\store\MyCustomStoreFactory
use League\FactoryMuffin\Stores\StoreInterface;

class MyCustomStoreFactory
{
    public function create(): StoreInterface
    {
        return CustomStore();
    }
}

class CustomStore implements StoreInterface
{
    // ...
}

Действия

have

Генерирует и сохраняет запись.

$I->have('User'); // creates user
$I->have('User', ['is_active' => true]); // creates active user

Возвращает экземпляр созданного пользователя.

  • param string $name
  • param array $extraAttrs

  • return object

haveMultiple

Генерирует и сохраняет запись несколько раз.

$I->haveMultiple('User', 10); // create 10 users
$I->haveMultiple('User', 10, ['is_active' => true]); // create 10 active users
  • param string $name
  • param int $times
  • param array $extraAttrs

  • return \object[]

make

Генерирует экземпляр записи.

Это не сохраняет её в базе данных. Используйте have для этого.

$user = $I->make('User'); // return User instance
$activeUser = $I->make('User', ['is_active' => true]); // return active user instance

Возвращает экземпляр созданного пользователя без создания записи в базе данных.

  • param string $name
  • param array $extraAttrs

  • return object

onReconfigure

@throws ModuleException

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

Spec-Zone.ru

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