如何模拟已经模拟的对象的实例方法?

pja*_*ers 4 ruby mocha.js

我需要嘲笑以下内容:

Class User
  def facebook
    #returns an instance of a facebook gem
  end
end
Run Code Online (Sandbox Code Playgroud)

因此,在我的用户测试中,要访问用户的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"]
Run Code Online (Sandbox Code Playgroud)

这有效,但似乎有点笨拙,有没有更好的方法来做到这一点?

[编辑]我正在使用mocha作为模拟框架

Jam*_*ead 12

你可以尝试这样的事情: -

user = Factory(:user)
user.stubs(:facebook => stub(:me => stub(:info => {:name => "John Doe"})))
Run Code Online (Sandbox Code Playgroud)

如果你真的想检查所有这些方法是否被调用(我怀疑你没有),你可以做以下事情: -

user = Factory(:user)
user.expects(:facebook => mock(:me => mock(:info => {:name => "John Doe"})))
Run Code Online (Sandbox Code Playgroud)

它有点冗长,但通常值得给每个模拟对象一个名字: -

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

我希望有所帮助.