Rails의 시스템 테스트(Minitest)에서 예상대로 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
Reference
이 문제에 관하여(Rails의 시스템 테스트(Minitest)에서 예상대로 404 오류가 발생했는지 확인하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jnchito/items/37fcaf4486c4bdf78802텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)