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ê?

Foi útil?

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

  1. Eu acho que o ajuste de expectativas em tal escondido lugar é provavelmente uma má idéia de qualquer maneira.
  2. Se você estiver indo para fazer isso, eu teria pensado usando stubs era mais apropriado do que expects.
  3. Pode valer a pena separar o método pull_tweets (e quaisquer métodos semelhantes) em uma classe TwitterAPI. Dessa forma, ele não parece tão ruim que você precisa configurar uma expectativa sobre o TwitterAPI 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top