Я имею этот код в своем контроллере и хочу протестировать эту строку кода с функциональным испытанием.
raise ActiveRecord::RecordNotFound if @post.nil?
которые утверждают метод, я должен использовать? Я использую встроенные направляющие 2.3.5 среды тестирования.
Я попробовал его этим кодом:
test "should return 404 if page doesn't exist." do
get :show, :url => ["nothing", "here"]
assert_response :missing
end
но это не работает на меня. Получил этот тестовый вывод:
test_should_return_404_if_page_doesn't_exist.(PageControllerTest):
ActiveRecord::RecordNotFound: ActiveRecord::RecordNotFound
app/controllers/page_controller.rb:7:in `show'
/test/functional/page_controller_test.rb:21:in `test_should_return_404_if_page_doesn't_exist.'
Вы можете сделать две вещи. Первый - позволить ActionController выполнять действие по умолчанию при спасении 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
Используя этот метод, вы не можете утверждать, что будет отрисовано. Вы должны быть уверены, что Rails / ActionController не изменит поведение.
Альтернатива, которую я иногда использовал, заключается в следующем:
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
Вам следует узнать больше о #rescue_from в ActiveSupport API.
Для простоты я обычно использую первое решение.