Skip to content

Instantly share code, notes, and snippets.

@gma
Last active September 13, 2022 17:18
Show Gist options
  • Save gma/893459 to your computer and use it in GitHub Desktop.
Save gma/893459 to your computer and use it in GitHub Desktop.
What's so bad about RSpec?
require 'rspec'
describe 'Rspec' do
it 'should not allow you to make shit up' do
[1, 2, 3].should have(4).potatoes
end
end
$ rspec ~/insane-magic.spec
F

Failures:

  1) Rspec should not allow you to make shit up
     Failure/Error: [1, 2, 3].should have(4).potatoes
       expected 4 potatoes, got 3
     # /Users/graham/insane-magic.spec:5

Finished in 0.00042 seconds
1 example, 1 failure

Do you see the potatoes method call? Why isn't Ruby complaining that it doesn't exist? Where the hell did it come from? Is it part of rspec? It must be, surely. That's the only library I've required!

[Goes off to grep the rspec gems for "potatoes"... doesn't find it]

What's happening here? RSpec is purposefully ignoring .potatoes, which is a method call on the object returned by #have. And what is that object, exactly?

So RSpec (and this "BDD" business) is good for people new to testing you say? Really?

The "call any method you like and we'll silently ignore it" behaviour is not syntactic sugar, it's pain and confusion for people who are new to programming. It's a bloody daft idea to put it forward as good practice in a widely popular library.

Some bad ideas catch on just as easily as good ideas, and this approach is its own special breed of footgun.

To be clear, I like describe and it. But you can stop there; I feel RSpec's features have a negative impact on productivity from there on in.

And for comparison, the Contest gem adds support for these blocks to test/unit in 100 lines of code.

@dchelimsky
Copy link

FYI: rspec/rspec-expectations#93. Feel free to add commentary there. I proposed one alternative, and would love to hear other proposals.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment