Module: Hermes
- Defined in:
- lib/hermes/builders.rb,
lib/hermes.rb,
lib/hermes/scopes.rb,
lib/hermes/actions.rb,
lib/hermes/context.rb,
lib/hermes/version.rb,
lib/hermes/assertions.rb
Overview
Rails developers have had bad experience with fixtures since a long time due to several reasons, including misuse.
This misuse of fixtures is often characterized by a huge ammount of fixtures, causing a lot of data to maintain and dependence between tests. In my experience working (and rescueing) different applications, 80% of these fixtures are used only by 20% of tests.
An example of such tests is a test that assures a given SQL query with GROUP BY and ORDER BY conditions returns the correct result set. As expected, we need a huge amount of data in this test which we usually don’t need in order tests.
For such scenarios, factories are a fine solution. They won’t clutter all your database since they are created for these specific tests and they are also easier to maintain.
I believe this was the primary reason for the Rails community to strongly adopt factories builders as we saw in the couple two years ago.
However, factories are also misused. It is common to see people creating a huge amount of data with factories before each test in their integration suite, causing their whole test suite to be slow, while fixtures would work great for this purpose.
This is a small attempt to have the best of both worlds.
For the data used in almost all your tests, use fixtures. For all the other smaller scenarios, use factories. As both fixtures and factories require valid attributes, this code below provides a quick solution that allows you to create small, simple factories from the information stored in your fixtures.
Examples
You can define your builder inside the Builders module:
module Hermes::Builders
build :message do
{ :title => "OMG", :queue => queues(:general) }
end
end
It should necessarily return a hash. After defining this builder, you can easily create a new message calling create_message
or new_message
in your tests. Both methods accepts an optional options parameter that is merged into the given hash.
Reusing fixtures
The great benefit of builders is that you can reuse your fixtures attributes, avoiding duplication. An explicit way of doing it is:
build :message do
(:fixture_one).attributes.merge(
:title => "Overwritten title"
)
end
However, Builders provide an implicit way of doing the same:
build :message, :like => :fixture_one do
{ :title => "Overwritten title" }
end
Just Ruby
Since all Builders are defined inside the Builders module, without a DSL on top of it, it allows us to use Ruby in case we need to do something more complex, like supporting sequences.
module Hermes::Builders
@@sequence = 0
def sequence
@@sequence += 1
end
end
Defined Under Namespace
Modules: Actions, Assertions, Builders, Context, Scopes Classes: IntegrationCase
Constant Summary collapse
- VERSION =
"0.4.0".freeze