Как смоделировать метод экземпляра уже смоделированного объекта? - PullRequest
3 голосов
/ 24 октября 2010

Мне нужно высмеять следующее:

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"]

Это работает, но кажется немного громоздким, есть ли лучший способ сделать это?

[править]Я использую мокко как насмешливый фреймворк

Ответы [ 2 ]

12 голосов
/ 02 декабря 2010

Вы можете попробовать что-то вроде этого: -

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"})))

Надеюсь, это поможет.

0 голосов
/ 02 декабря 2010

Если вы не хотите проверять, что все методы вызываются, вы также можете использовать различные альтернативы для насмешек.Например, вы можете использовать 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 в своих тестах, если вам нужнопроверить различные условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...