Testing a chained set of commands with RSpec

Viewed 36

I have the following code:

Rails.cache.redis.ping == "PONG"

and I'm trying to write a spec to stub this response so that I can control what it returns in tests. However, usual simple expectations don't seem to work here as it's a method chain.

How would I test this code in RSpec?

2 Answers

Rails.cache.redis returns an object of Redis class and the ping method is basically being called on an instance of the class. Here is how you can stub the ping method.

allow_any_instance_of(Redis).to receive(:ping).and_return(DESIRED_MOCK_VALUE)

You can use before block and stub the chain of messages

before do
  allow(Rails).to receive_message_chain(:cache, :redis, :ping).and_return("PONG")
end
Related