0

在 rpsec 2.12 中,我希望这个辅助方法定义能够工作:

module X
private
  def build_them(type)
    puts 'Catching the star'
  end  
end
context 'public/private instance methods' do
  subject{ Class.new { extend(::X) } }
  def subject.build(type)
    puts "Throwing a star"
    build_them(type)
  end
  it{ should respond_to :build}
end

实际结果是失败的规范:

expected #<Class:0x00000002ea5f90> to respond to :build

我希望这个例子能够通过

有关如何正确执行此操作的任何建议?

4

1 回答 1

1

在不传递块的情况下调用subject实际上会以 proc 形式返回“主题”块。这意味着在您的代码中,当您这样做时:

def subject.build(type)
  #...
end

您实际上是在proc本身上定义“构建”,而不是 proc 返回的对象。

it {...}示例块中,预期是针对 proc 返回的对象执行的,因此如您所见,测试失败。

要使测试通过,您需要在“主题”块将返回的实际对象上定义“构建”方法:

module X
  private
    def build_them(type)
      puts 'Catching the star'
    end
end

describe 'public/private instance methods' do
  subject {
    extender = Class.new { extend(::X) }
    def extender.build
      puts "Throwing a star"
      build_them(type)
    end

    extender
  }

  it { should respond_to :build }
end

注意describe必须作为顶层上下文,context必须嵌套

于 2012-12-20T11:01:55.917 回答