rspec-expectations
rspec-expectations copied to clipboard
Raise an error when calling custom matcher without using `.and`
Subject of the issue
Hi there folks 👋 ,
First of all, thank you for this great gem! I created this issue here just to offer a small idea, I encountered a small scenario when using custom matchers.
Let's say we have this custom matcher
RSpec::Matchers.define(:create_some_model) do
chain(:method1) {}
chain(:method2) {}
chain(:method3) {}
...
end
describe do
it do
expect { some_action }.to create_some_model(Model).method1.method2.method3.create_some_model(Model2)
end
end
As you can see, it is easy to make mistake as we sometime might forget to add .and between create_some_model and this could create false-positive test result as it will only run create_some_model(Model2). I understand that this is more human error but I would love to prevent it.
My idea is in RSpec::Matchers::DSL::Matcher, we also define
class RSpec::Matchers::DSL::Matcher
define_method(method) do
raise "You did not use .and between your 'create_some_model' test expectation"
end
end
So calling create_some_model twice will resulting in error like that. There is one catch with this approach is you cannot call the same create_some_model inside the matcher itself but IMHO, I don't think it is a good idea to do such
RSpec::Matchers.define(:create_some_model) do
chain(:method1) {}
chain(:method2) {}
chain(:method3) {}
def something
expect { }.to create_some_model <-- this doesn't work
end
...
end
I can create a PR to apply this idea, please let me know what do you guys think. Thank you for reading!
P/S:
There is 1 more approach besides that is to get rid of the defined custom matcher method from RSpec::Matchers::DSL::Matcher but if we do that we also have to get rid of the method_missing as well which I don't think it is a good idea.
Your environment
- Ruby version: 2.7.5
- rspec-expectations version: 3.13.0.pre