2016-12-20 88 views
1

我使用FactoryGirl宝石创建以下工厂:错误与工厂女孩的Rails on 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?您可以使用FactoryGirl的trait像这样:

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,我会检查这个特质。我没有使用它,因为我一直使用嵌套工厂,并且它一直运行到此刻之前。 我不知道特质,所以我会尽量使用它。谢谢您的帮助。 –