Added fixture method and bugfixes | This Week in Rails
セキュリティ問題に関する修正を含むバージョンがリリースされた、というお知らせです
2024-03-03現在では7.1系、7.0系、6.1系が対象となっています
意訳すると「Minitest と競合する可能性のあるフィクスチャ名に対して、汎用的なアクセサを実装しました」
ActiveRecordに関する変更です
fixtureとは、テストの対象としたいデータ(つまりサンプルデータ)を組み立てる手法のひとつです。
fixtureはYAMLファイルに保存されます。1つのYAMLファイルが1つのモデルに対応し、ActiveSupport::TestCase.fixture_path=(パス)で指定されたディレクトリに保存されます(このディレクトリはRailsで自動設定されますので、自分のRailsアプリ/test/fixtures/に保存できます)。fixtureファイル名の末尾には.yml拡張子が付きます。
fixtureファイルのフォーマットは次のような感じになります。
code:自分のRailsアプリ/test/fixtures/web_sites.yml
rubyonrails:
id: 1
name: Ruby on Rails
google:
id: 2
name: Google
test環境では、各テストの実行前にすべてのfixtureが自動的にデータベースに読み込まれます。データの一貫性を保つために、fixtureは読み込みが実行される前に環境によって削除されます
fixtureで登録したデータを読み出す方法は2つあります
モデル名をつかう
これは純粋にfixtureファイルのデータがテーブルに登録されているので、それを普段通り取得してるだけですね
code:rb
require "test_helper"
class WebSiteTest < ActiveSupport::TestCase
test "web_site_count" do
assert_equal 2, WebSite.count
end
end
特殊なメソッドをつかう
fixtureファイルの名前をメソッドとして呼び出すことができます
そのメソッドの引数にfixtureファイル内のkeyの名称(fixture名と呼ぶ)を指定すると、その名称と一致するデータを返してくれます
code:rb
test "find one" do
assert_equal "Ruby on Rails", web_sites(:rubyonrails).name
end
今回のプルリクエストでは、後者(つまり「特殊なメソッドをつかう」)の場合に関する変更を加えています
最近、Minitestに metadata というメソッドが追加されました
Minitestを利用していて、かつ、RailsのFixtureSetとして metadata.yml を利用している場合、metadata メソッドが競合してしまいます
その問題を避けるために、今回のプルリクエストでは明示的にFixtureSetを利用するためのメソッドとして fixture メソッドを実装しています
fixture(fixtureファイル名, fixture名) という形で利用できます
ActiveRecordに関する変更です
ActiveRecordにquery_constraintsというメソッドがあります
「SELECT / UPDATE / DELETEクエリのWHERE句」および「メソッド #first と #last のORDER BY句」で使用するカラムを指定できます
このメソッドに、引数を1つだけ、かつ、その引数がプライマリーキーではないカラム名の場合、エラーメッセージが不適切なものになっていたので、わかりやすいメッセージに変更されています
https://gyazo.com/d730bee48a763b159c76a3abe0dc4005