2016-12-23 7 views
1

私は次の問題があります。Rails 5 - FactoryGirlでのエラー

私はこのような変数を使用してファクトリー・ガールのRailsを使用しています:

FactoryGirl.define do 
    conta_destino_matriz = FactoryGirl.create(:conta_pessoa_fisica, saldo: 0) 
    conta_origem_filial = FactoryGirl.create(:conta_pessoa_fisica, saldo: 1000, ancestry: conta_destino_matriz.id) 

    codigo_transacional = TransacaoHelper::Gerador.codigo_alphanumerico(
    tipo: 'transferencia', conta_origem_id: conta_origem_filial.id, conta_destino_id: conta_destino_matriz.id 
) 

    factory :transacao_transferencia_matriz, class: Transacao do 
    tipo { 'transferencia' } 
    valor { '250' } 
    conta_origem_id { conta_origem_filial.id } 
    conta_destino_id { conta_destino_matriz.id } 

    trait :campos_completos do 
     codigo_transacional { codigo_transacional } 
     conta_origem_valor_antes_transacao { conta_origem_filial.saldo } 
     conta_destino_valor_antes_transacao { conta_destino_matriz.saldo } 
     estornado { false } 
     codigo_transacional_estornado { nil } 
    end 
    end 
end 

conta_destino_matrizが工場名定義の外で宣言されています。

conta_destino_id     { conta_destino_matriz.id } 
conta_destino_valor_antes_transacao { conta_destino_matriz.saldo } 

、別のテストは同じ関連工場conta_pessoa_fisicaと工場を使用しています:

FactoryGirl.define do 
    conta_origem_hierarquia_igual = FactoryGirl.create(:conta_pessoa_fisica, saldo: 1000) 
    conta_destino_hierarquia_igual = FactoryGirl.create(:conta_pessoa_fisica, saldo: 0, ancestry: conta_origem_hierarquia_igual.id) 
    codigo_transacional_hierarquia_igual = TransacaoHelper::Gerador.codigo_alphanumerico(
     tipo: 'transferencia', conta_origem_id: conta_origem_hierarquia_igual.id, conta_destino_id: conta_destino_hierarquia_igual.id 
) 

    conta_origem_hierarquia_diferente = FactoryGirl.create(:conta_pessoa_fisica, saldo: 1000) 
    conta_destino_hierarquia_diferente = FactoryGirl.create(:conta_pessoa_fisica, saldo: 0) 

    factory :transacao_transferencia_hierarquia, class: Transacao do 
    tipo { 'transferencia' } 
    valor { '250' } 
    conta_origem_id { conta_origem_hierarquia_igual.id } 
    conta_destino_id { conta_destino_hierarquia_igual.id } 

    trait :campos_completos do 
     codigo_transacional { codigo_transacional_hierarquia_igual } 
     conta_origem_valor_antes_transacao { conta_origem_hierarquia_igual.saldo } 
     conta_destino_valor_antes_transacao { conta_destino_hierarquia_igual.saldo } 
     estornado { false } 
     codigo_transacional_estornado { nil } 
    end 

    trait :diferente do 
     conta_origem_id { conta_origem_hierarquia_diferente.id } 
     conta_destino_id { conta_destino_hierarquia_diferente.id } 
    end 
    end 
end 

そしてこれはデ・工場からの二つの属性は以下のようにいくつかの関連付けから2つの値を持っている必要がありますので、これが必要です関連:

FactoryGirl.define do 
    factory :pessoa_fisica do 
    cpf { Faker::Number.number(11) } 
    nome { Faker::Name.name } 
    data_nascimento { Date.today.strftime('%Y-%m-%d') } 

    factory :pessoa_fisica_invalida do 
     id { 0 } 
     cpf { Faker::Number.number(10) } 
     nome { '' } 
     data_nascimento { (DateTime.now + 1.day).strftime('%Y-%m-%d') } 
    end 
    end 
end 

:pessoa_fisicaクラスの 'nome'属性にエラーが発生しました。フィールドmusはユニークで文字のみです。私のテストの実行とそれを呼び出したときに

nome { Faker::Name.name } 

ので、:transacao_transferencia_matrizと:時々transacao_transferencia_hierarquiaと私は、私は必ずしもこのエラーを得たことそれは、

`raise_validation_error': A validation failed: Nome is already taken (ActiveRecord::RecordInvalid) 

さらに悪いことを言うエラーが発生しましたでも時々。

答えて

1

あなたの工場に次の一意性を保証するものではありません:

nome { Faker::Name.name } 

偽物は限られたセットから名前を生成し、時にはすでにデータベースに存在している名前を返します。モデルの検証チェックがあるので、もちろん失敗します。

はあなたの工場内では、名前に一意の使用順序を保証するために:あなたは理想的にも、データベースは、各テストのためのクリーンな状態にあることを確実にしなければならない

sequence(:nome) {|n| "#{Faker::Name.name} #{n}" } 

からdatabase cleaner宝石をチェックアウト

+1

私はこのテーマを終わらせるために来ました。本当の問題は、FactoryGirlがデータベースをきれいにすることを期待していたということでしたが、それはしませんでした。だから、エラーはそれでした。 Fakerには、データベースと一致することがある名前の制限があり、エラーが発生したことを示します。 チップをありがとう。私もシーケンスを使用しますが、フィールドには数字を付けることができないので、この場合は文字で使用します。 –