There are two things you can do. The first is to let ActionController provide the default action when it rescues ActiveRecord::RecordNotFound:
class PostsControllerTest < ActionController::TestCase
test "raises RecordNotFound when not found" do
assert_raises(ActiveRecord::RecordNotFound) do
get :show, :id => 1234
end
end
end
Using this method, you can't assert what gets rendered. You have to trust Rails/ActionController not to change behaviour.
An alternative, which I've sometimes used, is this:
class PostsControllerTest < ActionController::TestCase
test "renders post_missing page, and returns 404" do
get :show, params: { :id => 1234 }
assert_response :not_found
assert_template "post_missing"
end
end
class PostsController < ApplicationController
def show
@post = current_user.posts.find_by!(slug: params[:slug])
end
rescue_from ActiveRecord::RecordNotFound do
render :action => "post_missing", :status => :not_found
end
end
You should read more about #rescue_from on the ActiveSupport API.
For simplicity, I usually go with my 1st solution though.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…