在类中启用expect语法

时间:2014-09-05 19:31:57

标签: ruby unit-testing rspec rspec3

在rspec 3.1.0中,规范可以使用#allow来存根方法:

describe do
  specify do
    o = Object.new
    allow(o).to receive(:foo)
    o.foo
  end
end

这很好用。但是,如果存根位于类中的方法内,则不会定义#allow方法:

describe do

  class Baz
    def allow_bar(o)
      allow(o).to receive(:bar)
    end
  end

  specify do
    o = Object.new
    Baz.new.allow_bar(o)
    o.bar
  end

end

错误是:

 Failure/Error: allow(o).to receive(:bar)
 NoMethodError:
   undefined method `allow' for #<Baz:0x8de6720>
 # ./bar_spec.rb:5:in `allow_bar'
 # ./bar_spec.rb:11:in `block (2 levels) in <top (required)>'

为什么我在班级

中存根

测试将其test double定义为常规类,而不是使用rspec的“double”方法。这是因为测试double有一个线程。在测试中,double是这段代码:

if command == :close
  # Note: Uses the old (rspec 2) syntax.  Needs to be converted
  # to rspec 3 syntax using the #allow method.
  socket.stub(:getpeername).and_raise(RuntimeError, "Socket closed")
end

这可以防止被测代码在会话关闭后错误地使用套接字。

私人解决方案

我可以通过调用rspec-mock中的私有API来为#allow提供测试双重访问权限:

  class Baz
    RSpec::Mocks::Syntax.enable_expect self    # Uses private API
    def allow_bar(o)
      allow(o).to receive(:bar)
    end
  end

这很有效。但是,它在rspec / mocks / syntax.rb中明确标记为私有API:

  # @api private
  # Enables the expect syntax (`expect(dbl).to receive`, `allow(dbl).to receive`, etc).
  def self.enable_expect(syntax_host = ::RSpec::Mocks::ExampleMethods)
  ...

问题

在Rspec 3.1中,是否有一个 public API可用于在类中提供expect语法?

0 个答案:

没有答案