2010-03-22 3 views
31

У меня есть этот код в контроллере и вы хотите протестировать эту строку кода с функциональным тестом.Как я могу проверить ActiveRecord :: RecordNotFound в моем приложении rails?

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.' 

ответ

49

Есть две вещи, которые вы можете сделать. Во-первых, чтобы обеспечить 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.

Для простоты я обычно хожу с моим 1-м решением.

+0

спасибо, мне это нравится! – xaver23

+0

Мне нравится 'rescue_from ActiveRecord :: RecordNotFound' в моем ApplicationController (в application_controller.rb), потому что мне не нравятся блоки' assert_raises'. –

Смежные вопросы