2011-07-03 6 views
15

とvalidate_uniqueness_of:RSpecの、shoulda、私はRSpecのテスト以下のいる範囲と間違ったエラーメッセージ

describe Productlimit do 

    before(:each) do 
    @productlimit = Factory.create(:productlimit, :user => Factory.create(:user)) 
    end 

    subject { @productlimit } 

    ... 

    it { should validate_uniqueness_of(:price_cents).scoped_to(:direction_down, :currency, :market_id, :user_id) } 
    ... 
end 

しかし、私は混乱エラー以下の取得:

1) Productlimit 
    Failure/Error: it { should validate_uniqueness_of(:price_cents).scoped_to(:direction_down, :currency, :market_id, :user_id) } 
     Expected errors to include "has already been taken" when price_cents is set to 9530, got errors: ["direction_down has already been taken (false)"] 

はあなたが私を助けることができるの?エラーメッセージが正しいように見えるので、なぜこれが動作していないのか分かりません。

EDIT:

これは、他の状況では、あまりにも起こる:

# product_spec.rb 
... 
it { should validate_numericality_of(:price).with_message("price_cents must be greater than 0 (0)") } 

# rake spec:models 
Failure/Error: it { should validate_numericality_of(:price).with_message("price_cents must be greater than 0 (0)") } 
    Expected errors to include "price_cents must be greater than 0 (0)" when price is set to "abcd", got errors: ["price_cents must be greater than 0 (0)"] 
+0

どのバージョンのshoulda/rspecを使用していますか? – nathanvda

+0

私はshoulda-matcher(1.0.0.beta2)を持っていますが、現在の 'shoulda'宝石でも試してみました。 – Lichtamberg

+0

あなたがすでにテストしているはずのものをテストしているようです。あなたのモデルでvalidate_numericalityを持っているのであれば、テストでそれをなぜ呼び出すのでしょうか?それは不要な複製です – corroded

答えて

11

validate_uniqueness_of(:field)をチェックするには、データベースのレコードが1つだけで、一意性制約をチェックする必要があります。 ここが....それはそれを試してうまくいく一意

it { should validate_uniqueness_of(:country_code)} 

を検証するために

before do 
    @country = FactoryGirl.create(:country, :id =>"a0000007-0000-0000-0000-000000000009",:currency_id => "a0000006-0000-0000-0000-000000000004",:merchant_id => "a0000001-0000-0000-0000-000000000002",:country_code => 'CAN', :name => 'Canada') 
end 

+0

ありがとう、素晴らしいヒント! –

0

test/fixtures/*を削除し、手動で(ファクトリーを使用していない)の一意性をテストする前にオブジェクトを作成しようとするようにしてください。また、試してみましたか:

class MyModelTest < ActiveSupport::TestCase 
+0

私はrspec(全くテストフォルダなし)でテストして、手動でオブジェクトを保存しようとしました。これは動作します。しかしテストはうまくいかない。 – Lichtamberg

2

sepc_helperにdatabase_cleaner設定がありますか? ない場合は、その後もあなたは工場出荷時のコードを投稿することができRSpec.configureブロック

config.use_transactional_fixtures = false 

config.before(:suite) do 
    DatabaseCleaner.strategy = :truncation 
end 

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

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

に以下を追加しspec_helper.rb に

gem "database_cleaner" 

を追加しますか?ちょうどもっと鮮明な画像を持つように。

こちらがお役に立てば幸いです。

また、direction_down属性に一意性検証があるかどうかを確認してください。

+0

あなたの答えをありがとう、この特定のテストを今取り除いて、それを自分で手動でテストしてください...あなたの解決策を試しましたが、いずれかの作業を試みました。 – Lichtamberg

0

price_centsの一意性が有効であることをテストするときに、direction_downの一意性について不平を言っているので、エラーは正規表現に対しては正しくありません。

モデルのコードにvalidates_uniqueness_of :direction_downが含まれていますか?もしそうなら、それはメッセージを説明するでしょう。

3

Richeには、direction_downについての一意性検証についてのコメントを追加するには、ProductLimitファクトリがdirection_downの値を生成する方法が疑わしいです。一意性検証を持つすべての属性に対して常に一意の値を生成するとは限りません。

また、私が一意性の検証に直面した問題の1つは、検証チェックが工場が「ランダムに」生成するものと競合する値を持たないようにする前に作成される最初のオブジェクト(あなたの場合は件名)です。 direction_down:上の一意性検証が存在する場合shouldaマッチングによって構築されたオブジェクトは、「ABC」にdirection_downセットで終了する場合の簡単な例で説明するために、

Factory(:product_limit, :direction_down => "abc") 
it { should validate_uniqueness_of(:price_cents).scoped_to(:direction_down) } 

は、誤っを失敗する可能性を有します。

0

予期しないクラッシュの後、最初のケース(validate_uniquess_of)が私に起こりました。単純なrake db:test:prepareを修正しました。

関連する問題