Secador de testes com associações em factory_girl
-
16-09-2019 - |
Pergunta
Alguém pode sugerir uma maneira melhor de fazer uma fábrica de utilizar um modelo pré-construído
instância por sua associação? Por exemplo, de modo que seria possível
abaixo para definir uma criança da fábrica de mensagem para que uma chamada para
Factory(:my_message)
poderia substituir
Factory(:message,:sender=>@me)
?
Às vezes o hash de configuração é mais envolvido do que neste artificial exemplo, ou é apenas repetido em tantos testes que parece melhor para empurrá-lo para dentro da fábrica.
Uma alternativa que eu posso pensar é definir um método de teste helper
tais como create_message_owned_by(@me)
, mas eu estou esperando há uma maneira em si factory_girl.
fábricas factory_girl:
Factory.define :sender do |s|
sender.name "Dummy name"
end
Factory.define :message do |msg|
msg.text "Dummy text"
msg.association :sender
end
Factory.define :my_message, :parent=>:message do |msg|
msg.text "Dummy text"
### ? what goes here for msg.association :sender ? ###
end
MessagesControllerTest trecho (usando shoulda):
context "on GET /messages" do
setup do
@me = Factory(:sender)
@my_message = Factory(:message,:sender=>@me)
@somebody_elses_message = Factory(:message)
sign_in_as(@me)
get :index
end
should "only assign my messages" do
assert_contains(assigns(:messages), @my_message)
assert_does_not_contain(assigns(:messages), @somebody_elses_message)
end
end
Solução
Eu não sei se é isso que você está procurando, mas se você primeiro criar a mensagem que você pode buscar o remetente por isso e atribuí-la a @me
.
@my_message = Factory(:message)
@me = @my_message.sender
Será que isso ajuda em tudo?
Outras dicas
Ignorando por um minuto o problema de criar uma dependência claro, o exemplo acima pode ser tratada com as novas chamadas de retorno em FactoryGirl 1.2.3. Há agora after_build
e after_create
retornos de chamada, de modo que você pode executar operações em objetos criados depois que eles já existem no banco de dados (e ter uma id para agarrar, etc).
Veja também esta questão e este fio da lista factory_girl de discussão