3

これは私には意味がありません。誰かが助けてくれることを願っています。ファクトリを使用してユーザーを作成すると、テストが 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 チュートリアルからのものです。私は、チュートリアルの最後で彼が言及しているアプリ機能拡張のいくつかに取り組んでいます。)

4

2 に答える 2

4

ファクトリはレコードを DB に入れます。User.new は、保存されるまで機能しません。元のテストでは、user_with_same_email が作成されるかどうかをチェックしません。メールが存在するために「it」(件名 { @user }) を作成できないことを確認します。@user に変更を加えた後、テストを書き直す必要がありました。

describe "when email address is already taken" do
  let (:user_with_same_email)  { @user.dup }

  specify { user_with_same_email.should_not be_valid }
end
于 2012-04-24T17:22:53.243 に答える
1

ありがとうエリック。あなたのテストに基づいて....

元のテストでは、大文字と小文字の区別と一意性もテストしていました。このテストはパスし、うまくいくようです。何かご意見は?

describe "when email address is already taken" do
  let(:user_with_same_email) { @user.dup }
  before do 
    user_with_same_email.email = @user.email.upcase 
    user_with_same_email.save
  end
  specify { user_with_same_email.should_not be_valid }
end
于 2012-04-24T20:45:42.990 に答える