これは私には意味がありません。誰かが助けてくれることを願っています。ファクトリを使用してユーザーを作成すると、テストが 1 回失敗します (同様のテストに合格したようです)。
私の user_spec.rb テスト ファイルでは、ユーザーはもともとこのように作成されていました。この初期化アプローチを使用すると、すべてのテストに合格します。
ユーザー作成
user_spec.rb (ファクトリーなし)
describe User do
before do
@user = User.new(name: "Example User", email: "user@example.com",
password: "foobar", password_confirmation: "foobar",
username: "username")
end
アプリの他のほとんどのテストでは、ファクトリを使用します。そのため、上記を工場への呼び出しに置き換えることにしました。
user_spec.rb (ファクトリーあり)
describe User do
before do
@user = FactoryGirl.create(:user)
end
工場
工場はこんな感じ。
factory.rb
FactoryGirl.define do
factory :user do
sequence(:name) { |n| "Person #{n}" }
sequence(:email) { |n| "person_#{n}@example.com" }
password "foobar"
password_confirmation "foobar"
sequence(:username) { |n| "username_#{n}" }
テストの失敗
ファクトリを使用してユーザーを作成するときのテストの失敗は次のとおりです。
user_spec.rb
Failures:
1) User when email address is already taken
Failure/Error: it { should_not be_valid }
expected valid? to return false, got true
# ./spec/models/user_spec.rb:101:in `block (3 levels) in <top (required)>'
Finished in 12.61 seconds
178 examples, 1 failure, 2 pending
テスト
これは、ファクトリに切り替えるときに失敗するテストの一部です。
describe "when email address is already taken" do
before do
user_with_same_email = @user.dup
user_with_same_email.email = @user.email.upcase
user_with_same_email.save
end
it { should_not be_valid }
end
USER と USER.DUP の検査
私が最初に考えたのは、工場で作成されたユーザーで .dup を使用していることが問題を引き起こしている可能性があるということでした。上記のテストでの使用からの出力時の @user と @user.dup を次に示します (記述ブロックに と の行puts @user.inspect
を追加しputs user_with_same_email.inspect
ます。これらputs
は両方とも の後にありますuser_with_same_email.save
)。
工場なし (テスト合格)
@ユーザー
#<User id: nil, name: "Example User", email: "user@example.com",
created_at: nil, updated_at: nil,
password_digest: "$2a$04$I/71i.fpTwfp4PqRwAvU4eUEjEkW/wubx6uVBqfNBShq...",
remember_token: nil, admin: false, username: "username">
user_with_same_email
#<User id: 1178, name: "Example User", email: "USER@EXAMPLE.COM",
created_at: "2012-04-24 06:01:07", updated_at: "2012-04-24 06:01:07",
password_digest: "$2a$04$I/71i.fpTwfp4PqRwAvU4eUEjEkW/wubx6uVBqfNBShq...",
remember_token: "rMS9jM0d4lobLc-A-pTTqA", admin: false, username: "username">
WITH FACTORY (テスト失敗)
@ユーザー
#<User id: 739, name: "Person 67", email: "person_67@example.com",
created_at: "2012-04-24 05:54:28", updated_at: "2012-04-24 05:54:28",
password_digest: "$2a$04$n4tToBVM2elz92cfHPKvte6dfHSBj4jDxG.w6DyKtGUR...",
remember_token: "fy2iifmhXVTFa1__d1dBJg", admin: false, username: "username_67">
user_with_same_email
#<User name: "Person 67", email: "PERSON_67@EXAMPLE.COM",
created_at: nil, updated_at: nil,
password_digest: "$2a$04$n4tToBVM2elz92cfHPKvte6dfHSBj4jDxG.w6DyKtGUR...",
remember_token: "fy2iifmhXVTFa1__d1dBJg", admin: false, username: "username_67">
上記で際立っているのは、ファクトリを使用しないと @user がまだ保存されていないことですが、ファクトリを使用すると @user が保存されます。この場合、これがテストにどのように影響するかわかりません。
どんな助けでも大歓迎です。ありがとう!
(上記のコードは、Michael Hartl の Rails チュートリアルからのものです。私は、チュートリアルの最後で彼が言及しているアプリ機能拡張のいくつかに取り組んでいます。)