问题
I'm stuck on a test scenario.
I have a controller method:
def update
@object = Object.find params[:id]
# some other stuff
@object.save
rescue ActiveRecord::StaleObjectError
# woo other stuff
end
The first part I test with:
context '#update'
let(:object) { double }
it 'nothing fails' do
# some other stuff
expect(Object).to receive(:find).with('5').and_return(object)
expect(object).to receive(:save).and_return(true)
xhr :put, :update, id:5
expect(response).to be_success
expect(assigns(:object)).to eq(object)
end
end
Now I want to test the ActiveRecord::StaleObjectError
exception. I want to stub it, but I didn't find any solution how to do this.
So my question is, how to raise the ActiveRecord::StaleObjectError
in an RSpec test?
回答1:
Like this, for example
expect(object).to receive(:save).and_raise(ActiveRecord::StaleObjectError)
回答2:
I would do something like this:
describe '#update' do
let(:object) { double }
before do
allow(Object).to receive(:find).with('5').and_return(object)
xhr(:put, :update, id: 5)
end
context 'when `save` is successful' do
before do
allow(object).to receive(:save).and_return(true)
end
it 'returns the object' do
expect(response).to be_success
expect(assigns(:object)).to eq(object)
end
end
context 'when `save` raises a `StaleObjectError`' do
before do
allow(object).to receive(:save).and_raise(ActiveRecord::StaleObjectError)
end
it 'is not successful' do
expect(response).to_not be_success
end
end
end
Please note that I make a difference between stubing methods in the test setup (I prefer allow
in this case) and the actual expectation (expect
).
来源:https://stackoverflow.com/questions/32354356/how-to-raise-an-exception-in-an-rspec-test