RSpec如何期望...改变... ......内部工作?

时间:2013-12-27 20:11:38

标签: ruby-on-rails ruby rspec

在RSpec中,有匹配器expect{}.to change{}.to喜欢

expect{employee.change_name}.to change{employee.name}.to "Mike"

它非常容易阅读,但从语言的角度来看,它的工作原理并不容易理解。我认为expecttochange是方法,但它们被称为什么对象?在这种情况下,花括号是什么意思?

谢谢。

2 个答案:

答案 0 :(得分:1)

他们在红宝石中是blocks

基本上是lambda表达式的第一步,基本上是匿名函数。

答案 1 :(得分:1)

changeexpectself的方法,而to是执行changeexpect的结果的方法。 {}表达式是传递给changeexpect的块。

以下说明了评估顺序:

def self.to1(arg)
  puts "to1(#{arg})"
  "to1"
end

def self.to2(arg)
  puts "to2(#{arg})"
  "to2"
end

def self.expect
  puts "expect"
  yield
  self
end

def self.change
  puts "change"
  yield
  self
end

expect{puts "b1"}.to1 change{puts "b2"}.to2 "#{puts 'Mike' ; 'Mike'}"

产生以下输出:

expect
b1
change
b2
Mike
to2(Mike)
to1(to2)
 => "to1"