Skip to content

Instantly share code, notes, and snippets.

@myronmarston
Last active October 22, 2020 18:16
Show Gist options
  • Star 23 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save myronmarston/4503509 to your computer and use it in GitHub Desktop.
Save myronmarston/4503509 to your computer and use it in GitHub Desktop.
Explanation for why `its` will be removed from rspec-3

its isn't core to RSpec. One the of the focuses of RSpec is on the documentation aspects of tests. Unfortunately, its often leads to documentation output that is essentially lies. Consider this spec:

User = Struct.new(:name, :email)

describe User do
  subject { User.new("bob") }
  its(:name) { should == "bob" }
end
$ bin/rspec user_spec.rb --format doc

User
  name
    should == "bob"

Finished in 0.00085 seconds
1 example, 0 failures

Randomized with seed 25153

It's not a true behavior of User#name that it always equals "bob". its generally leads to output that is true in a specific case, but false in the general case, and doesn't help understanding when reading the documentation output.

Those who like its tend to really like it and want to continue to evolve it to do more and more powerful and terse things, such as having it support arguments. We're uncomfortable with making its more and more meta (it's already meta enough!). We were planning on moving its into an external gem when we removed it from rspec-core, and @dnagir has already done that:

https://github.com/dnagir/its

Recently, we've also found some cases where there was some surprising, non-intuitive behavior with example groups that use subject and its:

rspec/rspec-core#768 (comment)

I think its gains you terseness at the expense of clarity, and in my judgement, it's a poor tradeoff.

I also feel like rspec-given is a better direction to go with one-liners. If you like one-liners, rspec-given encourages Given/When/Then one-liners, with no example docstrings at all. It's more of a unified vision for this kind of thing than the its method in rspec-core.

Finally, you can read @dchelimsky's thoughts on its from a while ago.

@fdutey
Copy link

fdutey commented Dec 14, 2018

I'd like to add that

its is forcing devs into 1 expect / case
have_attributes tends to lead dev to do exactly the opposite, aka drop all your shit in one test

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