我正在使用Ruby 1.9.3并尝试使用RSpec进行一些测试。
我有一个班级:
class A
def method1
"test"
end
end
class B < SimpleDelegator
def initialize(events)
@events = events
end
end
现在我正在尝试测试委派行为:
require 'spec_helper'
RSpec.describe B do
let(:a) { A.new }
let(:b) { B.new(a) }
it "Should delegate unknown calls to A object" do
expect(b.method1).not_to eq(nil)
end
end
我收到以下错误:
NoMethodError:
undefined method `method1' for nil:B
如果手动添加method_missing,似乎测试将通过:
class B < SimpleDelegator
def initialize(events)
@events = events
end
def method_missing(meth, *args, &blk)
@events.send(meth, *args, &blk)
end
end
我在这里做错了什么?
谢谢
答案 0 :(得分:1)
问题是您在没有调用super并传递要装饰的实例的情况下向B类添加了初始化程序。您的代码应如下所示:
class A
def method1
"test"
end
end
class B < SimpleDelegator
def initialize(events)
@events = events
super(events)
end
end
答案 1 :(得分:1)
您无需在initialize
上定义B
方法。 SimpleDelegator
为您定义了一个。当您定义自己的initialize
方法时,会覆盖从initialize
类继承的SimpleDelegator
方法。
试试这个:
class A
def method1
"test"
end
end
class B < SimpleDelegator
end
这是来自irb:B.new(A.new).method1 #=> "test"
您可以定义您自己的initialize
方法并致电super
,但除非您真的需要,否则我不会。