Database Fixtures ================= Fixtures are important part of testing. Their main purpose is to populate you with data that needed by testing different cases. With this data using your tests becoming more efficient and useful. Yii supports fixtures via the `yii fixture` command line tool. This tool supports: * Loading new fixtures to different storages like: database, nosql, etc; * Unloading fixtures in different ways (usually it is clearing storage); * Auto-generating fixtures and populating it with random data. Fixtures format --------------- Fixtures are objects with different methods and configurations, refer to official [documentation](https://github.com/yiisoft/yii2/blob/master/docs/guide/test-fixture.md) on them. Lets assume we have fixtures data to load: ``` #users.php file under fixtures data path, by default @tests\unit\fixtures\data return [ [ 'name' => 'Chase', 'login' => 'lmayert', 'email' => 'strosin.vernice@jerde.com', 'auth_key' => 'K3nF70it7tzNsHddEiq0BZ0i-OU8S3xV', 'password' => '$2y$13$WSyE5hHsG1rWN2jV8LRHzubilrCLI5Ev/iK0r3jRuwQEs2ldRu.a2', ], [ 'name' => 'Celestine', 'login' => 'napoleon69', 'email' => 'aileen.barton@heaneyschumm.com', 'auth_key' => 'dZlXsVnIDgIzFgX4EduAqkEPuphhOh9q', 'password' => '$2y$13$kkgpvJ8lnjKo8RuoR30ay.RjDf15bMcHIF7Vz1zz/6viYG5xJExU6', ], ]; ``` If we are using fixture that loads data to database then this rows will be applied to `users` table. If we are using nosql fixtures, for example `mongodb` fixture, then this data will be applied to `users` mongodb collection. You can implement different loading strategies and other needed things, for that refer to official [documentation](https://github.com/yiisoft/yii2/blob/master/docs/guide/test-fixture.md). Above fixture example was auto-generated by `yii2-faker` extension, read more about it in these [section](#auto-generating-fixtures). Loading fixtures ---------------- Fixtures classes should be suffixed by `Fixture` class. By default fixtures will be searched under `tests\unit\fixtures` namespace, you can change this behavior with config or command options. To apply fixture, run the following command: ``` yii fixture/apply ``` The required `fixture_name` parameter specifies a fixture name which data will be loaded. You can load several fixtures at once. Below are correct formats of this command: ``` // apply `users` fixture yii fixture/apply Users // same as above, because default action of "fixture" command is "apply" yii fixture Users // apply several fixtures. Note that there should not be any whitespace between ",", it should be one string. yii fixture Users,UsersProfiles // apply all fixtures yii fixture/apply all // same as above yii fixture all // apply Users fixture, but fixture will be taken from different path. yii fixture Users --fixturePath='@app/my/custom/path/to/fixtures' // apply fixtures, but for other database connection. yii fixtures Users --db='customDbConnectionId' // apply fixtures, but search them in different namespace. By default namespace is: tests\unit\fixtures. yii fixtures Users --namespace='my/custom/namespace' // apply fixtures without namespace under fixturesPath yii fixtures all --namespace='' ``` Unloading fixtures ------------------ To unload fixture, run the following command: ``` // unload Users fixture, by default it will clear fixture storage (for example "users" table, or "users" collection if this is mongodb fixture). yii fixture/clear Users // Unload several fixtures. Note that there should not be any whitespace between ",", it should be one string. yii fixture/clear Users,UsersProfiles // unload all fixtures yii fixture/clear all ``` Same command options like: `fixturesPath`, `db`, `namespace` also can be applied to this command. Configure Command Globally -------------------------- While command line options allow us to configure the migration command on-the-fly, sometimes we may want to configure the command once for all. For example you can configure different migration path as follows: ``` 'controllerMap' => [ 'fixture' => [ 'class' => 'yii\console\FixtureController', 'fixturePath' => '@app/my/custom/path/to/fixtures', 'db' => 'customDbConnectionId', ], ] ``` Auto-generating fixtures ------------------------ Yii also can auto-generate fixtures for you based on some template. You can generate your fixtures with different data on different languages and formats. These feature is done by [Faker](https://github.com/fzaninotto/Faker) library and `yii2-faker` extension. See extension [guide](https://github.com/yiisoft/yii2/tree/master/extensions/faker) for more docs.