はじめに
RSpecで、同じメソッドに対してのテストを複数回書くシーンでは、subjectを使うことでDRYなコードを書くことができます。
ここでは引数が必要なメソッドのテストをsubjectを用いて書きます。
実装
ユーザー名(user_name)、自己紹介(pr)カラムがあるユーザーを、フリーワードで検索するuser_search(free_word)メソッドをテストするとします。普通に書くと以下のように繰り返し同じ処理が出てきます。
spec/models/user_spec.rb
describe "#user_search" do
context "when 'user_name1' is given" do
it "return 1 result" do
expect(Job.user_search("user_name1").count).to eq 1
end
end
context "when 'pr1' is given" do
it "return 1 result" do
expect(Job.user_search("pr1").count).to eq 1
end
end
end
これは以下のようにsubjectでまとめて処理を書くことができます。
spec/models/user_spec.rb
describe "#user_search" do
subject { User.user_search(field).count }
context "when user_name1 is given" do
let(:field) { "user_name1" }
is_expected.to eq 1
end
context "when pr1 is given" do
let(:field) { "pr1" }
is_expected.to eq 1
end
end
引数はletで定義することができます。