Spying with Rspec
Spying is used to assert if a method has been called, here we will see how to use spies with Rspec.
Spies are similar to mock in the way that both assert if a method was called. But they are different in many ways.
One difference is that mocks have the assert before the action, while spies have action before assert.
Hence spies follow the Arrange-Act-Assert pattern which make tests easy to read and understand.
In Rspec, you just call spy to create a spy object. Here is a simple (but realistic) example of how to use spies with rspec:
class PushNotificationService
def initialize(notifier, message)
@notifier = notifier
@message = message
end
def call
@notifier.notify(@message)
end
end
RSpec.describe 'PushNotificationService' do
it 'calls sends pushnotification to the notifier' do
notifier = spy # this can be the platform-specific library (android/ios etc.)
message = 'Test Message'
service = PushNotificationService.new(notifier, message)
service.call
expect(notifier).to have_received(:notify).with(message)
end
endNotice that the example has three distinct sections Arrange - Act - Assert.
References:
-
More distinction on various TestDoubles by Martin Fowler