Обратите внимание на следующее: StubFoo - заглушка Foo, которую я хотел бы использовать для некоторых тестов.
class Runner
def run
Foo = StubFoo
foo = Foo.new
# using Foo...
end
end
Это генерирует следующее сообщение об ошибке: Dynamic constant assignment
Тем не менее, в RSpec я могу сделать следующее, что работает и совершенно законно:
it "should be an example" do
Foo = StubFoo
foo = Foo.new
foo.to_s.should == "I am stubbed!"
end
Несколько вопросов по этому поводу.
- Почему это работает с контрольным примером RSpec, но не с описанным выше методом?
- Насколько мне известно, "это" - просто метод в RSpec, но я могу переопределить константу в "методе".
Я делаю это до того, как использую фальшивый фреймворк, просто для того, чтобы понять, как в Ruby отличаются насмешки, заглушки и т. Д. Я слышал, что динамические языки легче смоделировать / заглушки, и в Интернете есть руководства, в которых простое переназначение классов выполняется, как описано выше. Из моего исследования в Ruby невозможно объявить константы внутри метода, но я запутался, как упоминалось выше.
Редактировать
Правильно, это начинает иметь больше смысла. Я обновил run, чтобы теперь использовать const_set.
def run
old = Foo
self.class.const_set(:Foo, StubFoo)
foo = Foo.new
puts foo.to_s
self.class.const_set(:Foo, old)
foo = Foo.new
puts foo.to_s
end
Это выдает предупреждение, однако, это то, что / как фреймворки работают тогда в Ruby? Очевидно, гораздо более элегантный и полный набор функций, но они просто подавляют это предупреждение?