考虑以下内容,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 测试用例,但不适用于上面的方法?
- 据我所知,“it”只是 RSpec 中的一个方法,但我可以在“方法”中重新声明一个常量。
我在使用模拟框架之前这样做纯粹是想知道模拟、存根等...在 Ruby 中有何不同。我听说动态语言更容易模拟/存根,并且互联网上有一些指南,其中简单的类重新分配如上所述。根据我的研究,在 Ruby 中不可能在方法中声明常量,但如上所述我很困惑。
Edit
是的,这开始变得更有意义了。我现在已经将 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 中模拟框架的工作原理吗?显然更加优雅且功能齐全,但他们只是压制了这个警告吗?
您不能使用以下方法重新分配方法定义中的常量Constant = value
。但是,您可以使用重新分配它们const_set
。基本上,它是为了阻止(但不是禁止)动态常量重新分配。
至于为什么它适用于it
: Yes, it
是一个方法,但你不是定义它,而是调用它。重新分配发生在您作为参数传递给的块内it
.
块继承创建它们的上下文的类型。这意味着在块内,self.class.name
将是您的测试类的名称。因此,当您在传递给块的内部定义常量时it
方法,您实际上是在测试类上定义一个常量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)