2014-01-22 20 views
1

在我的规范中,我尝试使用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) 

我可以,当然,使用#double一个#let内:

let(:plain_medium) = double Paper::Medium 

但是,那么MockSidePolicies类将无法访问它。

如何在课堂上使用rspec的#double方法?

回答

0

#double在混入的RSpec ::嘲笑:: ExampleMethods定义,所以只与混入扩展类:

describe Object 

    extend RSpec::Mocks::ExampleMethods 

    FOO = double Object 

    specify do 
     p FOO # => #<RSpec::Mocks::Mock:0x47404c4 @name=Object> 
    end  

end 
0

目标是创建一个具有动态行为的测试对,并且不需要为此创建类,至少在此情况下。

取而代之类常量,使用正常的“让”变量:

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