Как можно заглушить before_filter в суперклассе в Rails? - PullRequest
0 голосов
/ 23 февраля 2010

Я использую 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 то, что я хочу. Я просто не могу понять, как это сделать.

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

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

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

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

Спасибо

1 Ответ

2 голосов
/ 23 февраля 2010

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

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

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

 controller.instance_variable_get("@instancevar")

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

...