ActiveRecord::Base#destroyed?
was introduced in 2009, about a year before Rails 3.0 was released.
Still, I regularly see code that tests a destroy action by querying the database after deleting the record to see if it still exists:
delete :destroy Session.exist?(@session).should.be.false
lambda { delete :destroy }.should.change('Session.count' -1)
delete :destroy lambda { @session.reload }.should.raise(ActiveRecord::RecordNotFound)
By using ActiveRecord::Base#destroyed?
, you can ask ActiveRecord if #delete
or #destroy
was called on that specific object instance, without having to check the database:
describe SessionsController do before do @session = sessions(:harry) cookies[:authorization] = @session.token end it "logs the user out" do delete :destroy assigns(:session).should.be.destroyed end end
Be sure to test this on the same instance you called #delete
or #destroy
on, though.
Calling #destroyed?
on @session
instead of assigns(:session)
in the above example would return false
.
That’s because #destroy
and #delete
actually set a @destroyed
flag on the object instance, which is returned when you call #destroyed?
.