2016-12-23 3 views
1

다음 문제가 있습니다. 나는이 같은 변수를 공장 소녀 레일을 사용하고레일 5 - FactoryGirl 오류

: conta_destino_matriz는 공장 이름 정의 외부에 선언

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_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 

그리고 이것은이다 연관 :

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에는 때로는 데이터베이스와 일치하는 이름의 제한이 있으며 오류가 발생했습니다. 팁 주셔서 감사합니다. 필자도 역시 시퀀스를 사용 하겠지만, 필드에는 숫자가 없으므로이 경우 문자로 사용합니다. –