のドキュメントとソースコードを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
そうすれば、テストで期待値を設定する必要があるほど悪くはないように思えます。
その一部が役立つことを願っています。