在类(非实例)级别创建测试double

时间:2014-01-22 20:00:55

标签: ruby rspec

在我的规范中,我试图使用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方法?

2 个答案:

答案 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