dknx01/data-fixtures-phpunit
Install the Bundle
composer require --dev dknx01/data-fixtures-phpunit
Ensure DoctrineFixturesBundle and PHPUnit are already installed.
Create Minimal Config
Add this to config/packages/data_fixtures_php_unit.yaml:
data_fixtures_php_unit:
faker:
Register Fixtures as Services
Define your fixture classes (e.g., App\Tests\Fixtures\UserFixture) and register them in config/services_test.yaml:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\Tests\Fixtures\:
resource: '../tests/Fixtures/*Fixture.php'
tags: ['data_fixtures_php_unit.fixture']
First Test Usage Use the trait in a test class:
use Dknx01\DataFixturesPhpUnitBundle\Traits\LoadFixturesTrait;
class UserTest extends TestCase
{
use LoadFixturesTrait;
public function testUserCreation()
{
$this->loadFixtures(['UserFixture']);
// Test logic here
}
}
Reusable Fixtures
Define fixtures in App\Tests/Fixtures/ (e.g., UserFixture, ProductFixture) and load them across tests:
$this->loadFixtures(['UserFixture', 'ProductFixture']);
Dynamic Fixture Loading Load fixtures conditionally based on test methods:
public function testAdminUser()
{
$this->loadFixtures(['UserFixture', 'AdminRoleFixture']);
// ...
}
Faker Integration Use Faker in fixtures for dynamic data:
use Faker\Factory as Faker;
class UserFixture extends Fixture
{
public function load(ObjectManager $manager)
{
$faker = Faker::create();
$user = new User();
$user->setEmail($faker->unique()->email);
$manager->persist($user);
}
}
Test-Specific Fixtures Override fixtures for specific test classes:
# config/packages/test/data_fixtures_php_unit.yaml
data_fixtures_php_unit:
fixtures:
default: ['App\Tests\Fixtures\BaseFixture']
Ordering Fixtures
Use order in fixture classes to enforce load sequence:
class ProductFixture extends Fixture
{
public function getOrder(): int
{
return 1; // Loads before UserFixture (order=2)
}
}
Database Transactions
Combine with DatabaseTransactionsTrait to roll back after tests:
use Doctrine\ORM\Tools\Setup;
use Doctrine\DBAL\DriverManager;
class UserTest extends TestCase
{
use LoadFixturesTrait, DatabaseTransactionsTrait;
protected function setUp(): void
{
$this->loadFixtures(['UserFixture']);
}
}
Environment-Specific Fixtures
Use config/packages/test/ or config/packages/dev/ to isolate fixtures.
Custom Fixture Providers
Extend Faker with custom providers (e.g., Bundeslaender) for localized data:
data_fixtures_php_unit:
faker:
locale: 'de_DE'
providers: ['App\Tests\Faker\Bundeslaender']
Fixture Registration
data_fixtures_php_unit.fixture.services_test.yaml.Database State Pollution
DatabaseTransactionsTrait or DatabaseCleanupTrait to reset the DB.Circular Dependencies
getOrder() isn’t set.getOrder() for all fixtures.Faker Locale Mismatch
en_EN) may cause unexpected data in non-English tests.data_fixtures_php_unit:
faker:
locale: 'de_DE'
Fixture Overwriting
Faker::unique() or check for existing records:
if (!$manager->getRepository(User::class)->findOneBy(['email' => $email])) {
$manager->persist($user);
}
Log Fixture Execution
Enable debug mode in config/packages/dev/data_fixtures_php_unit.yaml:
data_fixtures_php_unit:
debug: true
Inspect Loaded Data
Use Doctrine’s EntityManager to query fixtures:
$user = $this->getEntityManager()->getRepository(User::class)->findOneBy(['email' => 'test@example.com']);
$this->assertNotNull($user);
Fixture Isolation
For complex tests, load fixtures in setUp() and clean up in tearDown():
public function tearDown(): void
{
$this->getEntityManager()->createQuery('DELETE FROM App\Entity\User')->execute();
}
Custom Fixture Loader
Extend the bundle’s FixtureLoader to add pre/post-load logic:
use Dknx01\DataFixturesPhpUnitBundle\Loader\FixtureLoader;
class CustomFixtureLoader extends FixtureLoader
{
protected function preLoad(): void
{
// Custom logic (e.g., enable soft deletes)
}
}
Register it in config:
data_fixtures_php_unit:
loader: 'App\Tests\Loader\CustomFixtureLoader'
Dynamic Fixture Discovery Use autoloading for fixtures in subdirectories:
services:
App\Tests\Fixtures\:
resource: '../tests/Fixtures/**/*Fixture.php'
tags: ['data_fixtures_php_unit.fixture']
Parallel Test Support For parallel tests, ensure fixtures are thread-safe or use test-specific databases.
Fixture Validation Add assertions to fixtures to validate data integrity:
class UserFixture extends Fixture
{
public function load(ObjectManager $manager)
{
$user = new User();
$user->setEmail('test@example.com');
$manager->persist($user);
$this->assertTrue($user->getEmail() === 'test@example.com');
}
}
How can I help you explore Laravel packages today?