I have a Logger class. I want to test that inside the function, the Logger will receive a log
call with foo
argument.
expect(Logger).to receive(:log).with("foo")
Bar.foo()
However during this some model callback will also call Logger.log("euu")
, Logger.log("arr")
, Logger.log("hmm")
and many others. Rspec seems to fails because log
was called with some other arguments first.
I am only concerned that log("foo")
is called once. Is there a way to do this kind of testing?
The approach is to allow calls to log
, do your stuff, and then check that log
has been called with the expected arguments, like this:
allow(Logger).to receive(:log)
Bar.foo
expect(Logger).to have_received(:log).with("foo")
RSpec calls this pattern Spies
You can use Receive Counts:
expect(Logger).to receive(:log).with('foo').at_least(:once)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With