RSpecによるRailsテストmodel について
学習したこと
基本、contextとitで大枠を決めてしまう。
context
とit
の言語を揃える。英語と日本語混在させない。describeも同じか。
context
には条件(「正しい値が入力されている場合」など)をit
には期待する結果(「ユーザーは登録可能である」など)を記載すること。
modelスペックはあくまでmodelで定義しているメソッドやバリデーションが正しく動くかのテスト。systemスペックはユーザー目線での一連の操作の流れをテストするもの。
spec/models/user_spec.rb
let(:user) { build :user }
context "値が入力されている場合" do
it "ユーザ登録は有効" do
expect(user).to be_valid
end
end
context "値が空白の場合" do
it "ユーザ登録は無効" do
expect(user).to be_invalid
end
end
context "無効なEメールを登録しようとした場合" do
it "emailのvalidateが正しく機能している" do
address = %w[user@example,com user_at_foo.org user.name@example.foo@bar_baz.com foo@bar+baz.com foo@bar..com]
address.each do |invalid_address|
expect(build(:user, email: invalid_address)).to be_invalid
end
end
end
context "Eメールが重複している場合" do
it "一意性が正しく機能する" do
duplicate_user.email = user.email.upcase
user.save!
expect(duplicate_user).to be_invalid
end
end
it "emailを小文字に変換後の値と大文字を混ぜて登録されたアドレスが同一" do
user.save!
end
describe "パスワードの長さ" do
context "パスワードが6桁の時" do
it "正しい" do
user = build(:user, password: "a" * 6, password_confirmation: "a" * 6)
expect(user).to be_valid
end
end
context "パスワードが5桁の時" do
it "正しくない" do
user = build(:user, password: "a" * 5, password_confirmation: "a" * 5)
expect(user).to be_invalid
end
end
end
end
models.user.rb
下記変更しテストを通過させた
参考
https://asteremily.hatenablog.com/entry/2019/03/10/193905