在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语法?