Я читал на RSpec, и я пытался выяснить, как RSpec's "должен", был реализован.
Кто-то мог дать руку, как meta природа этой функции работает?
Код расположен здесь:
http://github.com/dchelimsky/rspec/blob/master/lib/spec/expectations/extensions/kernel.rb
TIA,
- daniel
Разъяснение:
target.should == 5
То, как значение цели становилось переданным, "должно", который в свою очередь был "== "'d против 5?
Взгляните на класс OperatorMatcher .
Все сводится к тому, что Ruby позволяет вам опускать точки и скобки. На самом деле вы пишете:
target.should.send(:==, 5)
То есть отправить сообщение должен
объекту target
, а затем отправить сообщение ==
куда угодно ] должен
вернуться.
Метод должен
обезьяно пропатчен в ядро
, поэтому он может быть получен любым объектом. Сопоставитель
, возвращаемый , должен
содержать фактическое
, которым в данном случае является цель
.
Matcher
реализует метод ==
, который выполняет сравнение с ожидаемым
, которое в данном случае является числом 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!