Expecting change with RSpec #rails #testing #rspec
Usually when I try to test if a value has changed after a method has been called I will assert the initial value as one expectation followed by the action that changes it, and finally assert the value has changed.
For example this test will check if a user's bad login attempts are incremented when the user.record_bad_login!
method is called:
describe '#record_bad_login!' do
let(:user) { FactoryGirl.create(:user) }
it 'increments the bad login attempts count' do
expect(user.failed_login_attempts).to eq(0)
user.record_bad_login!
expect(user.failed_login_attempts).to eq(1)
end
end
RSpec provides us with a more straight forward way to "oneline" this type of test while making it more declarative:
describe '#record_bad_login!' do
let(:user) { FactoryGirl.create(:user) }
it 'increments the bad login attempts count' do
expect { user.record_bad_login! }.to change { user.failed_login_attempts }.from(0).to(1)
end
end
Read more here: https://www.relishapp.com/rspec/rspec-expectations/v/2-0/docs/matchers/expect-change
Tweet