4

私は以下をあざける必要があります:

Class User
  def facebook
    #returns an instance of a facebook gem
  end
end

したがって、ユーザーテストでは、ユーザーのFacebook情報にアクセスするにはuser.facebook.me.info、その情報を取得するために呼び出す必要があります。これをモックしたい場合は、現在次のものを使用しています。

@user = Factory(:user)
facebook = mock()
me = mock()
me.expects(:info).returns({"name" => "John Doe"})
facebook.expects(:me).returns(me)
@user.expects(:facebook).returns(facebook)
assert_equal "John Doe", @user.facebook.me.info["name"]

これは機能しますが、少し扱いに​​くいようです。これを行うためのより良い方法はありますか?

[編集]モックフレームワークとしてモカを使用しています

4

2 に答える 2

13

あなたはこのようなことを試すことができます:-

user = Factory(:user)
user.stubs(:facebook => stub(:me => stub(:info => {:name => "John Doe"})))

これらすべてのメソッドが呼び出されていることを本当に確認したい場合(私はあなたが呼び出していないようです)、次のようにすることができます:-

user = Factory(:user)
user.expects(:facebook => mock(:me => mock(:info => {:name => "John Doe"})))

もう少し冗長ですが、通常、各モックオブジェクトに名前を付ける価値があります:-

user = Factory(:user)
user.stubs(:facebook => stub('facebook', :me => stub('me', :info => {:name => "John Doe"})))

それがお役に立てば幸いです。

于 2010-12-02T13:25:10.147 に答える
0

すべてのメソッドが呼び出されていることを確認したくない場合は、モックの代わりにさまざまな方法を使用することもできます。たとえば、OpenStructを使用できます。

@user = Factory(:user)
facebook = mock()
me = mock()
me.expects(:info).returns({"name" => "John Doe"})
facebook.expects(:me).returns(me)
@user.expects(:facebook).returns(facebook)
assert_equal "John Doe", @user.facebook.me.info["name"]

になります

@user = Factory(:user)
@facebook = OpenStruct.new(:me => OpenStruct.new(:info => {:name => "John Doe"}))
@user.expects(:facebook).returns(@facebook)

このソリューションには、さまざまな条件をテストする必要がある場合に、テストで@facebookプロパティを変更できるという利点もあります。

于 2010-12-02T13:32:54.653 に答える