質問

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

他にもいくつか考えがあります:-

  1. いずれにせよ、このような隠れた場所に期待を寄せるのはおそらく悪い考えだと思います。
  2. それをやるつもりなら、私はそれを使用すると考えていただろう stubs よりも適切だった expects.
  3. 分けてみる価値はあるかも知れませんが、 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top