1

私はJRubyRailsアプリケーションでMochaとFactory_girlを使用しています。私が工場に電話するとき、私はすでにいくつかのモックが行われたオブジェクトを返したいと思います。これが私がやろうとしていることのコードスニペットです。

Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
  t.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end

ユニットと機能テストが実際にTwitterAPIから取得されることを望まないため、メソッドをスタブ化して、必要なものを返すようにします。しかし、これは機能していません。オブジェクトはスタブを行わずに戻ってきます。ファクトリーガールで作成されたオブジェクトが返される前に、実際にスタブを実行する方法はありますか?

4

2 に答える 2

6

コールバックが利用可能になりました:

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
于 2011-01-26T12:29:50.040 に答える
1

のドキュメントとソースコードをfactory_girl見ると、ブロックに生成されたオブジェクト (t例では ) は a のFactoryインスタンスであり、構築するオブジェクトのインスタンス (例では ) ではないようですtweet_feed_with_tweets。これは、pull_tweetsメソッドtの期待値を on に設定するFactoryと、 を呼び出したときに構築されるオブジェクトではなく、インスタンスに期待値が設定されることを意味しますFactory(:tweet_feed_with_tweets)。これは、あなたの例が期待どおりに機能しない理由を説明していると思います。

Factory.define私は間違っているかもしれませんが、ブロック内に期待値を追加する方法がわかりません。おそらくすでにこれについて考えたことがあるでしょうが、インスタンスを構築した後にテストに期待値を追加する方がよいと思います:-

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

複数の場所でこれが必要な場合は、メソッドに抽出できます:-

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

他のいくつかの考え:-

  1. このような隠れた場所で期待を設定するのは、とにかく悪い考えだと思います。
  2. もしあなたがそれをするつもりなら、私は を使うよりも を使うstubs方が適切だと思ったでしょうexpects
  3. pull_tweetsメソッド (および同様のメソッド) をTwitterAPIクラスに分離する価値があるかもしれません。TwitterAPIそうすれば、テストで期待値を設定する必要があるほど悪くはないように思えます。

その一部が役立つことを願っています。

于 2009-03-03T09:28:15.373 に答える