Ruby元编程,RSpec如何“应该”工作?

时间:2010-06-23 21:39:25

标签: ruby metaprogramming rspec

我正在阅读RSpec,我试图弄清楚RSpec的“应该”是如何实现的。

有人可以说明这个功能的元性质是如何起作用的吗?

代码位于:

http://github.com/dchelimsky/rspec/blob/master/lib/spec/expectations/extensions/kernel.rb

TIA,

-daniel

澄清:

target.should == 5

目标的价值是如何传递给“应该”的,反过来又是“==”与5对比?

1 个答案:

答案 0 :(得分:27)

看看class OperatorMatcher

这一切都归结为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}}