[rspec-users] Should(not?) test associations (was: Dealing with dependent data)
Jim Gay
jim at saturnflyer.com
Fri Jun 27 22:55:49 EDT 2008
On Jun 27, 2008, at 10:07 PM, David Chelimsky wrote:
> An association does not want you to know that it's an association.
> It wants you to think of it as any other attribute. Why do you care
> what it IS? Focus on what it DOES.
Good point. Being a newbie I sometimes find myself where I *think* I'm
doing it well, but find out that it's not quite that good afterall.
>
> My opinion is that attributes and associations are equally about
> structure, not behaviour. The fact that a project has an owner is
> not behaviour. The fact that the owner has an email address is not
> behaviour.
>
> The facts that you can't save a project without an owner, and you
> can't save an owner without a valid email address are behaviour. And
> by setting expectations around those, the attributes and
> associations themselves are handled implicitly:
>
> describe Project do
> it "should not be valid without an owner" do
> Project.new(:owner => nil).should_not be_valid
> end
> end
>
> Watch that fail saying that Project does not respond to 'owner='
> method. Add a migration and an association. Now it fails saying that
> it was valid. Add the validation and watch the example pass. That's
> TDD (yes, starting with a T).
>
> Any time I have a an attribute or an association that I *think* is
> supposed to be on a model, I try to think of what might be
> interesting about that attribute or association and set expectations
> about that.
>
> There are many who believe that we should have examples like
> "project.should have_one(:owner)." I can't say that those people are
> wrong if doing that is adding value to their process and helping
> them deliver quality software. For me, personally, it's just
> unnecessary noise that adds maintenance burden later when things
> move around. And it definitely ain't behaviour.
Thanks for the response. Perhaps I'm over thinking things. I agree
that "project.should have_one(:owner)" is unnecessary.
Somewhere the ideas get mangled for me.
Suppose a simple spec like this:
Project "should not be valid without a name"
Owner "should not be valid without a name"
How do you spec that the Owner may have 0 or more projects?
Owner "should be valid with 0 projects"
Owner "should be valid with more than 0 projects"
Or would you combine them
Owner "should have 0 or more projects"
Or should I not care at all about that and just specify that a Project
"should not be valid without an owner"?
More information about the rspec-users
mailing list