DEV Community

Vasily Polovnyov
Vasily Polovnyov

Posted on • Edited on

RSpec & Rails: what not to write in `it`

1. Useless, general words that bring no value:

# bad: what value? for what?
it "adds certain value"

# good
it "snoozes for an extra 5 minutes"


# bad: which result is correct?
it "returns correct result"

# good
it "returns user's initials"


# bad: how exactly it fails?
it "fails"

# good
it "raises a not found error"


# bad: formatted how?
it "returns formatted string"

# good
it "returns time in 24-hour format"

# bad: what 'ok' means?
it "is ok"

# good
it "creates draft invoices"
Enter fullscreen mode Exit fullscreen mode

2. Implementation details:

# bad
it "changes @scheduled_on"

# good
it "reschedules campaign"


# bad
it "sets @todos"

# good
it "assigns todos to a given user"
Enter fullscreen mode Exit fullscreen mode

3. Lies:

it "returns time in 24-hour format" do
  expect(...).to eq "9:25"
end

it "strips leading zeroes" do
  expect(foo(" 9:25 ")).to eq "9:25"
end
Enter fullscreen mode Exit fullscreen mode

See also:
RSpec Style Guide
Better Specs

Top comments (2)

Collapse
 
rjrobinson profile image
R.J. Robinson

Would you be able to expand on what to write in these cases? RSpec is supposed to be very human-readable, so you make a lot of statements on what not to write. Could you explain why it's terrible to write #it statements like the exampled, and then explain what would be the better alternative and why? I like the idea of your post, just looking for the value you are trying to add. Seems like an angry tweet currently.

Collapse
 
vasily profile image
Vasily Polovnyov

Could you explain why it's terrible to write #it statements like the exampled, and then explain what would be the better alternative and why?

Sure, please have another look at the updated post:
dev.to/vasily/rspec-rails-what-not...

I also added further reading: Better Specs and RSpec Style Guide.

What do you think?

I like the idea of your post, just looking for the value you are trying to add. Seems like an angry tweet currently.

Oh, I'm sorry. I didn't mean to make it angry or preachy. I'm not a native speaker, so I tried to make it short in order to avoid spelling and grammar mistakes :-)