David Chelimsky wrote:
I highly recommend this blog post by Jay Fields:
http://blog.jayfields.com/2009/02/thoughts-on-developer-testing.html
Cheers,
David
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users
Great post. Very down to earth and realistic.
This post raised a question for me. Jay talks about how the pattern
Object Mother gave way to Test Data Builders. I use Fixjour ("Word to
your object mother")[1], and other similar projects in my apps to
provide a set of sane default attributes for my models. You can then
easily override those defaults by passing in a hash with the values that
you need for the test. After reading Nat's post about Object Mother vs
Test Data Builders[2] , I have come to the conclusion that the "Object
Mother" libs that are popular in ruby land (i.e. Fixjour, Factory Girl)
are really more in line with the Test Data Builder pattern. Does
everyone agree with this conclusion or am I missing something? It may
be that I just use it differently, but according to Nat's post Test
Builders provide a sane set of defaults that you can then explicitly
override like so:
Invoice invoiceWithNoPostcode = new InvoiceBuilder()
.withRecipient(new RecipientBuilder()
.withAddress(new AddressBuilder()
.withNoPostcode()
.build())
.build())
.build();
Well.. this looks a lot like what I do in Ruby (but a lot more verbose):
invoice_with_no_postcode = new_invoice(:recipient =>
new_recipient(:address => new_address(:postcode => nil)))
Nat points out that problems with Object Mother arise when people start
adding factory methods to deal with the edge cases, such as
ObjectMother.new_invoice_with_no_postal_code. I totally agree that this
would be a problem since such abstraction results in hard to follow
tests (this is why I hate fixtures actually). From the projects I have
worked on I haven't seen the Object Mother libs abused this way and they
are used more like a Test Data Builder. The only difference I see is in
implementation, meaning the ruby libs tend to group all the factory
methods on one object or module just like Object Mother, while the
pattern Nat describes uses a separate builder class for each object. I
think this is really just details though and results from Ruby's
differences from Java.
Any thoughts? Are Ruby's Object Mothers really Test Data Builders?
-Ben
1. http://github.com/nakajima/fixjour/tree/master
2. http://nat.truemesh.com/archives/000714.html
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users