3

自動テストに問題があります。私のユーザーモデルでは、ユーザー名とメールアドレスは一意です。自動テストを開始すると、すべてが正常に機能します。2回目のラウンドでは、自動テストから、私は

検証に失敗しました:電子メールはすでに取得されています、ユーザー名はすでに取得されています

たった2つのテストでエラーが発生しました。理由がわかりません。factorygirlをシーケンスで使用します。これにより、新しいユーザー名が生成されるたびに生成されます。

これは私のrspec2ファイルです:

describe User do

  specify {  Factory.build(:user).should be_valid }

  context "unique values" do

    before :all do
       @user = Factory.create(:user)
    end


    it "should have an unique email address" do
       Factory.build(:user, :email  => @user.email).should_not be_valid
    end

    it "should have an unique username" do
       Factory.build(:user, :username  => @user.username).should_not be_valid
    end

  end


  context "required attributes" do

    it "should be invalid without an email address" do
       Factory.build(:user, :email => nil).should_not be_valid
    end

    it "should be invalid without an username" do
       Factory.build(:user, :username  => nil).should_not be_valid
    end

    it "should be invalid without an password" do
       Factory.build(:user, :password  => nil).should_not be_valid
    end

    it "should be invalid without an address" do
        Factory.build(:user, :address  => nil).should_not be_valid
    end


  end
end

工場:

Factory.sequence :username do |n|
  "Outfit#{n}er"
end

Factory.sequence :email do |n|
  "user#{n}@example.com"
end

Factory.define :user do |u|
  u.username              { Factory.next :username }
  u.email                 { Factory.next :email }
  u.password              'secret'
  u.phone_number          '02214565854'
  u.association :address, :factory => :address
end

Factory.define :confirmed_user, :parent => :user do |u|
  u.after_build { |user| user.confirm! }
end

動作していない2つのテストは、「一意の値」のコンテキストにあります。他のすべてのテストはエラーなしで機能します。

ありがとう

4

4 に答える 4

1

いくつかのテストの後、データベースが適切にクリアされていないために、この問題が発生しました。

自動テストの前に rake db:test:prepare を実行すると、まだ発生しますか?

最終的に、クリアされていないテストを特定して修正 (または削除) することで、問題を回避しました。申し訳ありませんが、何が問題だったのか思い出せませんが、何らかのエラーが原因でした。

ああ、私は spork なしで実行したので、ロガーのメッセージが結果に混ざっているのを見ることができました。

お役に立てれば。

于 2011-11-16T19:02:05.400 に答える
1

これはまさに私が遭遇したばかりの問題であり、「rake spec」を実行しているだけではこの問題が発生しないという奇妙な経験がありました。

明らかな答えが見つからなかった後、問題を解決したと思われる何かを試しました! FactoryGirl を使用している場合、 before() ブロック内にクラス変数を設定することが原因のようです。

私は非常に似たものを持っていました:

factory :widget do
  sequence(:name) { |n| "widget#{n}" }
end

それから:

describe Widget do
  before(:each) { @widget = FactoryGirl.create(:widget) }
  it ...yadda yadda...
    @widget.foo()
  end
end

autotest は、一意性制約の問題を検出します。rspect テストを次のように変更しました。

describe Widget do
  let(:widget) { FactoryGirl.create(:widget) }
  it ...yadda yadda...
    widget.foo()
  end
end

...そして、一意性制約の問題は解消されました。なぜこれが起こるのかわからず、起こるべきではないように思えますが、実行可能な解決策かもしれません.

于 2011-08-25T20:15:48.330 に答える
0

私は非常によく似た問題に遭遇し、このスレッドでいくつかの提案を試しましたが、うまくいきませんでした。ただし、spec_helper.rb に以下を追加して修正しました。

# Clean up the database
  require 'database_cleaner'
   config.before(:suite) do
     DatabaseCleaner.strategy = :truncation
     DatabaseCleaner.orm = "mongoid"
  end

  config.before(:each) do
    DatabaseCleaner.clean
  end

また、DatabaseCleaner gem を gemfile に追加することを忘れないでください。

于 2012-12-20T15:48:29.107 に答える
0

問題はおそらく設定ファイルにあります。仕様構成ファイル (おそらく spec_helper.rb) に次のような行があります。

config.use_transactional_fixtures = false

これは次のようになります。

config.use_transactional_fixtures = true

または、トランザクション フィクスチャを使用したくない場合は、テストに before(:each) 関数を含める必要があります。

前:それぞれ行う
  User.destroy_all
終わり

別の方法として、非トランザクションのフィクスチャやシーケンスとの互換性が高いSham gem をファクトリに使用しています。

于 2011-01-04T23:22:03.423 に答える