Retornando objetos mock de Factory Girl
-
09-09-2019 - |
Pergunta
Eu estou usando Mocha e factory_girl em um JRuby trilhos aplicação. Quando eu chamar a fábrica gostaria de devolver os objectos com algum zombeteiro já feito. Aqui está um trecho de código do que estou tentando fazer.
Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
t.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end
Porque eu não quero que minha unidade e teste funcional para realmente puxar a partir da API do Twitter que eu quero para stub do método para que ele retorna o que eu quero. Mas isto não está funcionando. O objeto volta sem qualquer stubbing feito. Existe uma maneira de realmente ter Stubbing executada em um objeto criado com a menina fábrica antes que seja devolvido a você?
Solução
Olhando para o código de documentação e fonte para factory_girl
, parece que o objeto passado para o bloco (t
, no seu exemplo) é uma instância de uma Factory
e não uma instância do objeto que você deseja construção (o tweet_feed_with_tweets
, no seu exemplo). Isto significa que definir uma expectativa para o método pull_tweets
em t
está ajustando a expectativa na instância Factory
e não no objeto que será construído quando você chamar Factory(:tweet_feed_with_tweets)
. Acho que isso explica por que seu exemplo não está funcionando como o esperado.
Posso estar errado, mas eu não posso ver uma maneira de adicionar a expectativa dentro do bloco Factory.define
. Você provavelmente já pensou nisso, mas acho que você seria melhor fora adicionando a expectativa no teste depois que você construiu o exemplo: -
def test_should_do_something
tweet_feed = Factory(:tweet_feed)
tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)])
# test stuff here
end
Se você precisar isso em vários lugares, você pode extraí-lo em um método: -
def test_should_do_something
tweet_feed = build_tweet_feed_with_tweets
# test stuff here
end
private
def build_tweet_feed_with_tweets
tweet_feed = Factory(:tweet_feed)
tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)])
return tweet_feed
end
Um par de outros pensamentos: -
- Eu acho que o ajuste de expectativas em tal escondido lugar é provavelmente uma má idéia de qualquer maneira.
- Se você estiver indo para fazer isso, eu teria pensado usando
stubs
era mais apropriado do queexpects
. - Pode valer a pena separar o método
pull_tweets
(e quaisquer métodos semelhantes) em uma classeTwitterAPI
. Dessa forma, ele não parece tão ruim que você precisa configurar uma expectativa sobre oTwitterAPI
no teste.
Eu espero que alguns dos que ajuda.
Outras dicas
Callbacks estão agora disponíveis:
Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
t.after_build do |tt|
tt.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end
end