Dan*_*iel 13 ruby rspec metaprogramming
我正在阅读RSpec,我正在试图弄清楚RSpec的"应该"是如何实现的.
有人可以介绍一下这个函数的元性质是如何工作的吗?
代码位于:
http://github.com/dchelimsky/rspec/blob/master/lib/spec/expectations/extensions/kernel.rb
TIA,
-daniel
澄清:
target.should == 5
Run Code Online (Sandbox Code Playgroud)
目标的价值是如何传递给"应该"的,而这又是"=="与5的对比?
Bry*_*Ash 27
这一切都归结为Ruby允许你省略句号和括号.你真正写的是:
target.should.send(:==, 5)
Run Code Online (Sandbox Code Playgroud)
也就是说,将消息发送should
到对象target
,然后将消息发送==
到任何should
返回.
这个方法should
是猴子修补的Kernel
,所以它可以被任何对象接收.在Matcher
通过返回should
保持actual
在这种情况下target
.
该Matcher
工具的方法==
,其确实与比较的expected
,在这种情况下,是数字5.减少例子,你可以尝试自己:
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!
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2011 次 |
最近记录: |