RoR: цепной огрызок с использованием мокко - PullRequest
1 голос
/ 26 октября 2010

Можно ли заглушить всю цепочку с помощью мокко?Например, я хочу получить заглушку:

User.first.posts.find(params[:id])

, чтобы вместо доступа к базе данных она возвращала предопределенный пост-экземпляр.В идеале, я бы хотел сделать что-то вроде:

@post = Post.new
User.any_instance.stubs(:posts,:find).returns(@post)

Как вы можете видеть, я убираю методы 'posts' и 'find' вместе.Очевидно, что сейчас это не работает, но есть ли способ добиться этого эффекта?Благодарю.

РЕДАКТИРОВАТЬ: Я нашел следующее онлайн, который взламывает способ сделать это:

module Mocha
  module ObjectMethods
    def stub_path(path)
      path = path.split('.') if path.is_a? String
      raise "Invalid Argument" if path.empty?
      part = path.shift
      mock = Mocha::Mockery.instance.named_mock(part)
      exp = self.stubs(part)
      if path.length > 0
        exp.returns(mock)
        return mock.stub_path(path)
      else
        return exp
      end
    end
  end
end

С этим, вы можете вызвать User.any_instance.stub_path ('posts.find '). возвращает (@post)

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Я задал похожий вопрос (и способ его решения) здесь: Как смоделировать метод экземпляра уже смоделированного объекта?

Как этот вопрос доказывает, не уверенэто правильный путь.

0 голосов
/ 22 ноября 2012

На основании http://viget.com/extend/stubbing-method-chains-with-mocha вы можете попробовать:

User.stubs(:first).returns(stub(:posts => stub(:find => @post)))

Хотя я мог только заставить эту форму работать:

find = stub
find.stubs(:find).returns(@post)
posts = stub
posts.stubs(:find).returns(find)
User.stubs(:first).returns(posts)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...