非常に初歩的なミスだが、戒めのための備忘録
Userモデルのfirst_name
にはvalidates :first_name, presence: true
というバリデーションがかけられており、バリデーションが正しく動いているかテストしたかったので、バリデーションをかけた際に以下のようにオブジェクトにエラーメッセージが含まれるか確認するための非常によくあるテストを書いた
it "is invalid without a first name" do
user = User.new(
first_name: nil,
last_name: "Sumner",
email: "tester@example.com",
password: "dottle-nouveau-pavilion-tights-furze"
)
expect(user.errors[:first_name]).to include("can't be blank")
end
上記のspceを実行したところ以下のようなエラーが出た
1) User is invalid without a first name
Failure/Error: expect(user.errors[:first_name]).include("can't be blank")
NoMethodError:
undefined method `include' for an instance of RSpec::Expectations::ValueExpectationTarget
# ./spec/models/user_spec.rb:23:in `block (2 levels) in <top (required)>'
Rspec上で作成されたインスタンスにinclude
メソッド(マッチャ)が無いなんてことあるか?と思ったが、単純にバリデーションを実行した結果を返すvalid?
を書き忘れていたという超初歩的なミスだった
it "is invalid without a first name" do
user = User.new(
first_name: nil,
last_name: "Sumner",
email: "tester@example.com",
password: "dottle-nouveau-pavilion-tights-furze"
)
user.valid? # 追加
expect(user.errors[:first_name]).to include("can't be blank")
end
以上