Как я могу проверить ActiveRecord :: RecordNotFound в моем приложении rails? - PullRequest
34 голосов
/ 22 марта 2010

У меня есть этот код в контроллере, и я хочу проверить эту строку кода с помощью функционального теста.

raise ActiveRecord::RecordNotFound if @post.nil?

Какой метод подтверждения мне следует использовать?Я использую встроенную платформу rails 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.'

1 Ответ

54 голосов
/ 22 марта 2010

Есть две вещи, которые вы можете сделать. Первый - позволить 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 в API ActiveSupport.

Для простоты я обычно использую свое первое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...