如何使用SimpleDelegator和RSpec测试委托方法?

时间:2014-08-20 20:31:15

标签: ruby rspec delegates

我正在使用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

我在这里做错了什么?

谢谢

2 个答案:

答案 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,但除非您真的需要,否则我不会。