Изменение класса ruby ​​не работает должным образом при запуске Spork

У меня есть простой класс Ruby в моем приложении Rails, который я повторно открываю в тестовой среде. В основном это выглядит

class A
  def get_dependency
    B
  end
  ... some other methods ...
end

И в моей тестовой среде в огурце (в файле, загруженном из functions/env.rb) (и аналогичном месте для rspec) я делаю

class A
  def get_dependency
    MockedB
  end
end

Это отлично работает при обычном запуске, но когда у меня работает Spork, он странно терпит неудачу. Метод get_dependency класса A перезаписан правильно, но все другие общедоступные методы теперь отсутствуют. Любые идеи?

Я предполагаю, что это как-то связано с порядком загрузки, но я не получил никаких изменений, когда переместил требование для своего файла из раздела предварительной загрузки Spork.


person ced    schedule 04.04.2012    source источник


Ответы (2)


Это не лучший ответ, но это обходной путь. Вместо повторного открытия класса я просто изменил экземпляр singleton. Код в основном такой же, за исключением того, что я добавил метод экземпляра для A:

class A
  def instance
    @@instance ||= A.new
  end
end

Затем в моем тестовом коде я изменил экземпляр

instance = A.instance
def instance.get_dependency
  MockedB
end

И мне просто нужно было убедиться, что мой фактический код всегда вызывает A.instance вместо A.new.

person ced    schedule 05.04.2012

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

Возможное решение, которое вызывает автозагрузчик перед переопределением метода, таково:

A.class_exec do
  def get_dependency
    MockedB
  end
end

Он поднимет ConstMissing, если A не может быть автоматически загружен в этот момент (возможно, автозагрузчики еще не настроены).

person Ry Biesemeyer    schedule 17.04.2012