我正在阅读RSpec,我试图弄清楚RSpec的“应该”是如何实现的。
有人可以说明这个功能的元性质是如何起作用的吗?
代码位于:
http://github.com/dchelimsky/rspec/blob/master/lib/spec/expectations/extensions/kernel.rb
TIA,
-daniel
澄清:
target.should == 5
目标的价值是如何传递给“应该”的,反过来又是“==”与5对比?
答案 0 :(得分:27)
这一切都归结为Ruby允许你省略句号和括号。你真正写的是:
target.should.send(:==, 5)
即,将消息should
发送到对象target
,然后将消息==
发送到should
返回的任何内容。
方法should
被猴子修补到Kernel
,因此它可以被任何对象接收。 Matcher
返回的should
包含actual
,在这种情况下为target
。
Matcher
实现与==
进行比较的方法expected
,在这种情况下,module Kernel
def should
Matcher.new(self)
end
end
class Matcher
def initialize(actual)
@actual = actual
end
def == expected
if @actual == expected
puts "Hurrah!"
else
puts "Booo!"
end
end
end
target = 4
target.should == 5
=> Booo!
target = 5
target.should == 5
=> Hurrah!
是数字5.您可以自己尝试的简化示例:< / p>
{{1}}