工員からモックオブジェクトを返す
-
09-09-2019 - |
質問
JRuby Rails アプリケーションで 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 から取得したくないので、メソッドをスタブにして、必要なものを返すようにしたいと考えています。しかし、これは機能しません。オブジェクトはスタブ化を行わずに返されます。Factory Girl で作成されたオブジェクトが返される前に、実際にスタブ化を実行する方法はありますか?
解決
ドキュメントとソースコードを見ると、 factory_girl
, 、オブジェクトがブロックに屈したように見えます (t
, 、あなたの例では)はのインスタンスです Factory
構築したいオブジェクトのインスタンスではありません ( tweet_feed_with_tweets
, 、あなたの例では)。これは、次のような期待を設定することを意味します。 pull_tweets
メソッドオン t
に期待を寄せています 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
テストで。
それが少しでも役立つことを願っています。
他のヒント
コールバックが利用可能になりました。
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