在我的规范中,我试图使用rspec的#double方法创建一个类常量。类常量的原因是MockSidePolicies可以访问它:
describe Pages do
PLAIN_MEDIUM = double Paper::Medium
class MockSidePolicies
def policy(medium)
{
PLAIN_MEDIUM => PLAIN_POLICY,
...
}[medium]
end
...
end
这不起作用:
undefined method `double' for #<Class:0xa0ff334> (NoMethodError)
我当然可以在#let中使用#double:
let(:plain_medium) = double Paper::Medium
但是MockSidePolicies类将无法访问它。
如何在班级使用rspec的#double方法?
答案 0 :(得分:0)
目标是创建一个具有动态行为的测试双重,并且您不需要为此创建一个类,至少在此实例中。
使用普通的“let”变量代替类常量:
let(:plain_medium) {'plain medium'}
let(:plain_policy) {SidePolicy.new}
而不是一个班级,只需进行一次正常的测试:
let(:side_policies) {double SidePolicies}
然后,在之前的块中,为其提供所需的动态行为:
before(:each) do
side_policies.stub(:policy) do |medium|
{
plain_medium => plain_policy,
preprinted_medium => preprinted_policy,
}[medium]
end
end
答案 1 :(得分:0)
#double 在mixin RSpec :: Mocks :: ExampleMethods中定义,所以只需使用mixin扩展类:
describe Object
extend RSpec::Mocks::ExampleMethods
FOO = double Object
specify do
p FOO # => #<RSpec::Mocks::Mock:0x47404c4 @name=Object>
end
end