1

我想让一个类的实例方法返回 self,并与另一个类实例 self 一起初始化。
但是,我正在努力了解如何简洁地说明这一点:

::Api.should_receive(:new).once do |arg|
  arg.should be_an_instance_of(::Cli)
end

运行此规范时,这可确保在 true 而不是 Api 实例上调用 next 方法,正如预期的那样,即块的返回值。例子:

class Cli
  def eg
    api = Api.new(self)
    api.blowup # undefined method for true
  end
end

我真的很希望该块返回 Api 实例自身而不Api.new(...)在规范中调用另一个调用,下面的示例就是这样做的,在我看来,非 rspec 读者会想知道为什么规范在明显Api.new(...)被多次调用时会通过.

谁能建议如何最好地做到这一点?

当前解决方案: 这读起来像::Api.new(...)被称为三次:一次创建api,一次创建cli,一次创建start。然而,一个电话的规格通过了。我理解为什么并且这是正确的,所以不是错误。但是,我想要一个不熟悉 rspec 的读者可以扫描并且不会有Api.new被多次调用的印象的规范。另请注意,...once.and_return(api){...}不起作用,该块需要返回api才能通过。

let(:cli){ ::Cli.start(['install']) }
let(:start){ ::Cli.start(['install']) }
it 'is the API' do
  api = ::Api.new(cli)
  ::Api.should_receive(:new).once do |arg|
    arg.should be_an_instance_of(::Cli)
    api
  end
  start
end
4

1 回答 1

1

您可以将原始方法 ( ) 保存在局部变量中,然后使用它从块new中返回新方法:api

original_method = ::Api.method(:new)
::Api.should_receive(:new).once do |arg|
  arg.should be_an_instance_of(::Cli)
  original_method.call(arg)
end

这将运行期望,检查参数是否是 的实例::Cli,然后从原始方法(即 api)返回值。

于 2012-11-25T13:48:06.203 回答