16 Aug Having troubles with expect_any_instance_of behavior? How to expect n number of times a method is invoked?
In case you are having troubles to use the
expect_any_instance_of
From Rspec, guess what, it is not only you, many of us have faced the same troubles before, you can see it here in the thread discussion
https://github.com/rspec/rspec-mocks/issues/910
I really agree with this argument:
The name of the method is “expect_any_instance_of” so I would expect this to mean that any instance could receive it. Instead, you’ve implemented it so that it refers to a single instance. So really, “expect_any_instance_of” actually means “expect_exactly_one_instance_of” and the name “expect_any_instance_of” is deceptive in my opinion and a violation of the Principle of Least Surprise.
So, to make the long story short here is what I ended up, thanks to the last comment by MaxPleaner
I have a class that makes a retry to the database let’s say
class InvoiceFinder def self.find_with_retry tries = 2 time_span_start = Time.zone.now loop do params = { user_ids: user_ids, start: time_span_start } invoices = InvoceQuery.new(params).upcoming_invoices if(invoices.present? || tries <= 0 break else time_span_start += 5.days tries -= 1 end end invoices end end
In order to make sure the retry works we could have some Rspec just like this:
context 'when there is more than 1 retry from the database' do before do @counting_executions = 0 allow_any_instance_of(InvoceQuery).to receive(:upcoming_invoices) do @counting_executions += 1 [] end end it 'makes three retries to get data from the databases' do InvoiceFinder.find_with_retry expect(@counting_executions).to eq 3 end end
There you, let me know any comments and thoughts, have you used any other strategy to test these sort of scenarios?
Keep learning, coding and relax.
H.
No Comments