のドキュメントとソースコードを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
他のいくつかの考え:-
- このような隠れた場所で期待を設定するのは、とにかく悪い考えだと思います。
- もしあなたがそれをするつもりなら、私は を使うよりも を使う
stubs方が適切だと思ったでしょうexpects。
pull_tweetsメソッド (および同様のメソッド) をTwitterAPIクラスに分離する価値があるかもしれません。TwitterAPIそうすれば、テストで期待値を設定する必要があるほど悪くはないように思えます。
その一部が役立つことを願っています。