Rails의 시스템 테스트(Minitest)에서 예상대로 404 오류가 발생했는지 확인하는 방법

10635 단어 minitestRSpecRails
Rails의 시스템 테스트(Minitest)에서'예상대로 404 오류가 발생했다'는 것을 검증하는 방법은 의외로 어렵기 때문에 설명해 드리겠습니다.
대상 버전
  • Rails 6.1.5
  • Capybara 3.36.0
  • selenium-webdriver 4.1.0
  • 사절하다
    난 이 방법이 최선이라고 자신없어 더 나은 방법을 아는 사람이 있다면 댓글창에 알려줘🙏
    404 오류가 발생한 용례를 검증해야 한다
  • 로그인하지 않은 사용자가 로그인한 사용자만 표시할 페이지를 시스템 테스트에서 확인하려는 경우 404 오류
  • 를 반환합니다.
    302는 첫 페이지로 방향을 바꾸어 "로그인하십시오"라는 정보를 표시합니다. 이런 행동도 있지만 404 오류가 표시됩니다.
    기본 테스트 코드
    여기에 다음과 같은 테스트 코드를 썼다고 가정합니다. (위에서 쓴 용례와 상관없이 동작을 확인하는 테스트 코드일 뿐입니다.)
    require "application_system_test_case"
    
    class BlogsTest < ApplicationSystemTestCase
      setup do
        @blog = blogs(:one)
      end
    
      test "visiting a Blog" do
        # 存在しないidを指定して、意図的に404エラーを発生させる
        visit blog_url(@blog.id + 1)
      end
    end
    
    이 테스트를 실행하면 다음 오류 메시지가 표시되며 테스트가 실패합니다.
    2022-03-15 08:59:43 +0900 Rack app ("GET /blogs/980190963" - (127.0.0.1)): #<ActiveRecord::RecordNotFound: Couldn't find Blog with 'id'=980190963>
    E
    
    Error:
    BlogsTest#test_visiting_a_Blog:
    ActiveRecord::RecordNotFound: Couldn't find Blog with 'id'=980190963
        app/controllers/blogs_controller.rb:63:in `set_blog'
    
    rails test test/system/blogs_test.rb:16
    
    Finished in 2.137874s, 0.4678 runs/s, 0.0000 assertions/s.
    1 runs, 0 assertions, 0 failures, 1 errors, 0 skips
    
    그러나 여기서 404 오류가 발생하는 것은 테스트 실패가 아니라 성공이기 때문에 나는'404 오류가 예상대로 발생하면 경로이고 발생하지 않으면 오류'라고 말하고 싶다.
    404 오류를 검증하는 테스트 코드의 쓰기
    이번에는 이런 방법으로 테스트를 하기로 했습니다.
    class BlogsTest < ApplicationSystemTestCase
      setup do
        @blog = blogs(:one)
        @raise_server_errors = Capybara.raise_server_errors
      end
    
      teardown do
        Capybara.raise_server_errors = @raise_server_errors
      end
    
      test "visiting a Blog" do
        Capybara.raise_server_errors = false
    
        visit blog_url(@blog.id + 1)
        assert_text 'ActiveRecord::RecordNotFound'
      end
    end
    
    이렇게 하면 (ActiveRecord:RecordNotFund) 테스트가 통과됩니다.
    2022-03-15 09:04:50 +0900 Rack app ("GET /blogs/980190963" - (127.0.0.1)): #<ActiveRecord::RecordNotFound: Couldn't find Blog with 'id'=980190963>
    .
    
    Finished in 2.026935s, 0.4934 runs/s, 0.9867 assertions/s.
    1 runs, 2 assertions, 0 failures, 0 errors, 0 skips
    
    예상과 반대로 404 오류가 발생하지 않으면 테스트가 실패합니다.
    F
    
    Failure:
    BlogsTest#test_visiting_a_Blog [/Users/jnito/dev/sandbox/not-found-test-sandbox/test/system/blogs_test.rb:18]:
    expected to find text "RecordNotFound" in "Title: MyString\nEdit | Back"
    
    rails test test/system/blogs_test.rb:16
    
    Finished in 4.355798s, 0.2296 runs/s, 0.2296 assertions/s.
    1 runs, 1 assertions, 1 failures, 0 errors, 0 skips
    
    변경점에 대한 설명Capybara.raise_server_errors = false 설정 후 404 오류가 발생하더라도 테스트에 실패하지 않습니다.
    하지만 단순히 이 설정 변경만 추가하면 모든 테스트에 이 변경이 적용된다.따라서 setup 방법으로 원시 값을 보존하고 teardown 방법으로 원래 값을 복원한다.
      setup do
        @blog = blogs(:one)
        # 元の値をインスタンス変数に保存する
        @raise_server_errors = Capybara.raise_server_errors
      end
    
      teardown do
        # 元の値に戻す
        Capybara.raise_server_errors = @raise_server_errors
      end
    
      test "visiting a Blog" do
        # このテストを実行するときだけ設定を変える
        Capybara.raise_server_errors = false
    
        visit blog_url(@blog.id + 1)
        assert_text 'ActiveRecord::RecordNotFound'
      end
    
    assert_text 'ActiveRecord::RecordNotFound' 섹션에서는 브라우저에 오류 메시지가 표시되는지 확인합니다.

    참조 정보: Rspec의 경우
    RSpec이면 다음 테스트 코드를 작성하십시오 (rspec-rails5.0.2로 실행 확인).
    드라이버로 사용테스트 사용 시
    require 'rails_helper'
    
    RSpec.describe "Blogs", type: :system do
      before do
        driven_by(:rack_test)
      end
    
      example 'Page not found' do
        blog = Blog.create!(title: 'MyText')
    
        # visitしたタイミングで例外が発生することを検証する
        expect{ visit blog_url(blog.id + 1) }.to raise_error(ActiveRecord::RecordNotFound)
      end
    end
    
    드라이버로 사용웹 드라이버 사용 시
    require 'rails_helper'
    
    RSpec.describe "Blogs", type: :system do
      before do
        driven_by(:selenium_chrome_headless)
      end
    
      describe '404 error' do
        # aroundフックを使って、Minitestでいうところのsetupとteardownと
        # 設定値の変更を一気に行う
        around do |example|
          original = Capybara.raise_server_errors
          Capybara.raise_server_errors = false
          example.run
          Capybara.raise_server_errors = original
        end
    
        example 'Page not found' do
          blog = Blog.create!(title: 'MyText')
          visit blog_path(blog.id + 1)
          # ブラウザ上にエラーメッセージが表示されていることを検証する
          expect(page).to have_text 'ActiveRecord::RecordNotFound'
        end
      end
    end
    

    좋은 웹페이지 즐겨찾기