Download the PHP package xi/fixtures without Composer
On this page you can find all versions of the php package xi/fixtures. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Package fixtures
Short Description Convenient creation of Doctrine entities in tests. Like Ruby's FactoryGirl.
License BSD-3-Clause
Homepage http://github.com/xi-project/xi-fixtures
Informations about the package fixtures
Xi Fixtures
Xi Fixtures provides convenient and scalable creation of Doctrine entities in tests. If you're familiar with FactoryGirl for Ruby, then this is essentially the same thing for Doctrine/PHP.
In a nutshell
Imagine we're setting up a test and need 3 users in the database. With Xi Fixtures we can specify in one place that each user needs a unique username and needs to belong to a group (via a one-to-many relation):
Now in our tests we can simply say:
Motivation
Many web applications have non-trivial database structures with lots of dependencies between tables. One component of such an application might deal with entities from only one or two tables, but those entities may depend on a complex entity graph to be useful or to pass validation.
For instance, a User
may be a member of a Group
, which is part of an Organization
, which in turn depends on five different tables describing who-knows-what about the organization. You are writing a component that changes the user's password and are currently uninterested in groups, organizations and their dependencies. How do you set up your test?
- Do you create all dependencies for
Organization
andGroup
to get a validUser
in yoursetUp()
? No, that would be horribly tedious and verbose. - Do you make a shared fixture for all your tests that includes an example organization with satisifed dependencies? No, having loads of tests depend on a single fixture makes changing that fixture later difficult.
- Do you use mock objects? Sure, but in many cases, however, the code you're testing interacts with the entities in such a complex way that mocking them sufficiently is impractical.
Xi Fixtures is a middle ground between (1) and (2). You specify how to generate your entities and their dependencies in one central place but explicitly create them in your tests, overriding only the fields you want.
Tutorial
We'll assume you have a base class for your tests that sets up a fresh EntityManager
connected to a minimally initialized blank test database. A simple factory setup looks like this.
Now you can easily get entities and override fields relevant to your test case like this.
Singletons
Sometimes your entity has a dependency graph with several references to some entity type. For instance, the application may have a concept of a "current organization" with users, groups, products, categories etc. belonging to an organization. By default FixtureFactory
would create a new Organization
each time one is needed, which is not always what you want. Sometimes you'd like each new entity to point to one shared Organization
.
Your first reaction should be to avoid situations like this and specify the shared entity explicitly when you can't. If that isn't feasible for whatever reason, FixtureFactory
allows you to make an entity a singleton. If a singleton exists for a type of entity then get()
will return that instead of creating a new instance.
It's highly recommended to create singletons only in the setups of individual test classes and NOT in the base class of your tests.
Many-to-many
FixtureFactory helps you get started in constructing many-to-many associations.
The following example creates a User that belongs to three Groups. Both sides of the association are updated.
The above code also works if the association is one to many. This is an alternative to using ->reference()
from the 'many' side.
Advanced
You can give an afterCreate
callback to be called after an entity is created and its fields are set. Here you can, for instance, invoke the entity's constructor. FixtureFactory
doesn't invoke the constructor by default since Doctrine doesn't either.
You can define multiple versions of the same entity under different names with the entityType
method.
API reference
Miscellaneous
FixtureFactory
andDSL
are designed to be subclassable.- With bidirectional one-to-many associations, the collection on the 'one'
side will get updated as long as you've remembered to specify the
inversedBy
attribute in your mapping. - If you share your Doctrine entity manager between tests then
remember to clear its internal state between tests with
$em->clear()
.
Change log
-
1.1.1
- Added
referenceMany
and made one-to-many references specifiable on the many-side.
- Added
-
1.1
- Deprecated legacy API, implemented DSL.
- 1.0
- Initial release with legacy API.