2009-02-25 7 views
1

JRubyレールアプリケーションで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 

私は自分のユニットと機能テストは、実際に私はそれは私が欲しいものを返すようメソッドをスタブにしたいTwitterのAPIからプルする必要はありませんので。しかし、これは動作していません。オブジェクトは、スタブを行わずに戻ってきます。工場の女の子があなたに返される前に作成されたオブジェクトに実際にスタブを実行する方法はありますか?

+0

あなたはまだ答えを働いたことがありますか?私の答えは助けになりましたか? –

答えて

1

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

私は間違っているかもしれませんが、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 

あなたが複数の場所でこれを必要な場合は、することができます私は、このような隠れ場所に期待を設定することは、とにかく、おそらく悪いアイデアだと思います

  1. - :

    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 
    

    他の思考のカップル - :メソッドにそれを抽出します。

  2. もしあなたがそれをやろうとしたら、私はstubsを使ったほうがexpectsより適切だと思っていたでしょう。
  3. pull_tweetsメソッド(と同様のメソッド)をTwitterAPIクラスに分ける価値があります。そうすれば、テストではTwitterAPIの期待値を設定する必要があります。

私はそれが役立つことを願っています。

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 
関連する問題