2016-12-20 2 views
1

Я использую FactoryGirl драгоценный камень, чтобы создать следующую фабрику:Ошибка со сложной фабрики с Factory Girl Rails на Rails 5

FactoryGirl.define do 
    conta_origem = FactoryGirl.create(:conta_pessoa_fisica) 
    conta_destino = '' 
    tipos = LogTransacao.tipos.keys 
    params = { conta_origem: conta_origem, conta_destino: conta_destino, tipo: tipos[0] } 
    codigo_transacional = LogTransacaoHelper::Gerador.codigo_alphanumerico(params) 

    factory :log_transacao_carga, class: LogTransacao do 
    codigo_transacional { codigo_transacional } 
    tipo { tipos[0] } 
    estornado { false } 
    valor { 0 } 
    conta_origem_id { conta_origem.id } 
    conta_origem_valor_antes_transacao { conta_origem.saldo } 
    end 
end 

conta.rb 
FactoryGirl.define do 
    factory :conta do 
    nome { Faker::Name.name } 
    saldo { 0 } 
    status { 1 } 

    factory :conta_pessoa_fisica do 
     pessoa_type { 'PessoaFisica' } 
     pessoa_id { FactoryGirl.create(:pessoa_fisica).id } 
    end 
    end 
end 

Таким образом, я получаю следующее сообщение об ошибке :

find': Factory not registered: pessoa_fisica 

Эта проблема не не происходит, когда я использую FactoryGirl.create внутри завода «: log_transacao_carga».

conta_origem_id {FactoryGirl.create (: conta_pessoa_fisica) .id}

Однако, если я делаю это, я не могу использовать тот же завод для заполнения conta_origem_valor_antes_transacao. Поэтому мне нужно создать этот завод перед фабрикой log_transacao_carga.

Не мог бы кто-нибудь помочь мне, пожалуйста?

ответ

0

This problem does no occur when I use the FactoryGirl.create inside of the factory ':log_transacao_carga'.

log_transacao_carga работает, потому что вы передаете имя класса к нему (LogTransacao).

Любая конкретная причина, по которой вы делаете вложенные заводы против trait? Вы можете использовать trait FactoryGirl как так:

FactoryGirl.define do 
    factory :conta do 
    nome { Faker::Name.name } 
    saldo { 0 } 
    status { 1 } 

    trait :conta_pessoa_fisica do 
     pessoa_type { 'PessoaFisica' } 
     pessoa_id { FactoryGirl.create(:pessoa_fisica).id } 
    end 
    end 
end 

, а затем вызвать его с build(:conta, :conta_pessoa_fisica). Таким образом, он лучше читает, и вы можете наследовать атрибуты родительских фабрик и добавлять/редактировать те, которые вам нужны в определенном контексте.

Отъезд FactoryGirl документы: http://www.rubydoc.info/github/thoughtbot/factory_girl/FactoryGirl/Syntax/Methods

Вот хорошее вводное видео от создателей FactoryGirl: https://thoughtbot.com/upcase/videos/factory-girl

+0

Эй, @Dimitry_N, я буду проверять эту черту. Я не использовал его, потому что я всегда использовал вложенные фабрики, и он всегда работает до этого момента. Я не знаю черт, поэтому я попытаюсь использовать его. Спасибо за помощь. –

Смежные вопросы