Как я могу заглушить before_filter в суперклассе в Rails?

Я использую RR для имитации и заглушки в RSpec, и я столкнулся с ситуацией, когда я хотел бы заглушить метод из суперкласса контроллера, который устанавливает некоторые переменные экземпляра. Я могу решить, как заглушить вызов метода, и если я отлаживаю, я вижу, что мой заглушенный блок вызывается, но я не могу заставить переменные экземпляра в блоке распространяться в тестируемый класс.

Лишь бы разобрать:

class A < ApplicationController
  before_filter :bogglesnap

  def bogglesnap
    @instancevar = "totally boggled"
  end
end

class B < A
  def do_something_with_instance
    if @instancevar 
      ....
    else
      ....
    end
  end
end

Это базовая настройка, и поэтому в моих тестах для контроллера B я хотел бы заглушить метод bogglesnap из A, чтобы установить @instancevar на то, что я хочу. Я просто не могу понять, как это сделать.

Я пробовал заглушку instance_of RR и просто заглушал определение контроллера:

stub.instance_of(A).bogglensap { @instancevar = "known value" }
stub(controller).bogglesnap { @instancevar = "known value" }

но ни один из них, похоже, не работает, ну, они не работают :)

Есть ли у кого-нибудь какие-либо указания о том, как вы должны заглушить вызов этого метода и установить переменные экземпляра? Я предполагаю, что это связано с контекстом, в котором запускается блок, но я надеюсь, что кто-то уже сталкивался с чем-то подобным.

Спасибо


person ozzyaaron    schedule 23.02.2010    source источник


Ответы (1)


Вы можете использовать метод instance_variable_set, вызвав экземпляр объекта и установив его на все, что хотите, например

 controller.instance_variable_set("@instancevar", "known value")

и аналогичным образом, если вы когда-нибудь захотите получить значение переменной экземпляра в своей спецификации или отладить или сделать что-то еще вне класса, вы можете получить значение, выполнив

 controller.instance_variable_get("@instancevar")

Имейте в виду, что методы instance_variable_set и instance_variable_get доступны не только контроллерам, но и всем объектам, как это предусмотрено ruby. На самом деле, эти два метода играют важную роль в магии рельсов :)

person nas    schedule 23.02.2010
comment
Я знал о переменной экземпляра и материалах динамического программирования, которые предлагает ruby, я просто не думал об их использовании... спасибо за мозговой толчок! :) Только что попробовал и убедился, что работает. - person ozzyaaron; 24.02.2010