I was afraid that David Chelimsky was going to take away my toys! Consider, explicit use of subject in RSpec considered a smell:
The problem with this example is that the word “subject” is not very intention revealing. That might not appear problematic in this small example because you can see the declaration on line 3 and the reference on line 6. But when this group grows to where you have to scroll up from the reference to find the declaration, the generic nature of the word “subject” becomes a hinderance to understanding and slows you down.
I’m so guilty of using subject
heavily. Even worse, I’ve been advocating it to others too. In my defense, it does lend a good deal of concision to specs and seemed like a golden path.
Luckily, David isn’t taking away my toys. He’s got an even better recommendation: just use a method or let
with a intention-revealing name. Here’s his example:
describe Article do
def article; Article.new; end
it "validates presence of :title" do
article.should validate_presence_of(:title)
end
end
This is, now that I’m looking at it, way better. As this spec grows, you can add helpers for article_with_comments
, article_with_author
, etc. and it’s clear right on the line that helper is used what’s going on. No jumping back and forth between contexts. Thumbs up!
Have you ever checked out Fixjour(https://github.com/nakajima/fixjour) from Pat Nakajima? It’s a library that people assume is like FactoryGirl but is actually just a dsl to setup methods like you’re suggesting. I’ve been using it and recommending folks look into for years.
I’ve tried approaches _like_ that, but haven’t decide if they’re really friend or foe. The specifics of fixjour look interesting, though. I’ll keep it in mind next time I’m scaling up a test suite and start feeling the object mother pain.