12

我在应用程序配置中定义了一个选项。我要测试的课程是在 gem 中定义的(不是我写的)。我想重新开课:

Myclass.class_eval do

   if Rails.application.config.myoption=='value1'
      # some code
      def self.method1
      end
   else 
       # another code
      def self.method2
      end
   end
end

我想使用 RSpec 3 测试这段代码:

# myclass_spec.rb

require "rails_helper"

RSpec.describe "My class" do
  allow(Rails.application.config).to receive(:myoption).and_return('value1')

  context 'in taxon' do

  it 'something' do
    expect(Myclass).to respond_to(:method1)
  end

  end
end

如何在运行重新打开类的代码之前存根应用程序配置值。

4

1 回答 1

12

哇,这已经在这里很久了,但就我而言,我所做的是:

allow(Rails.configuration.your_config)
  .to receive(:[])
  .with(:your_key)
  .and_return('your desired return')

规范传递和配置值正确存根。=)

run现在,另一件事是关于您的实现,我认为如果您从 a或您决定要执行的某个东西中定义这两个方法和内部,那会更好。像这样的东西:

class YourClass
  extend self

  def run
    Rails.application.config[:your_option] == 'value' ? first_method : second_method
  end

  def first_method
    # some code
  end

  def second_method
    # another code
  end
end

希望这可以帮助。

编辑:哦,是的,我的错,我的答案基于这个

于 2016-02-12T15:36:42.150 回答