【发布时间】:2010-08-04 21:22:06
【问题描述】:
考虑以下情况,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 中的工作方式/方式?显然更加优雅和功能齐全,但他们只是压制这个警告吗?
【问题讨论】: