Rspec使用应用程序控制器方法

时间:2016-08-04 08:48:31

标签: ruby-on-rails rspec

我的application controller中有方法,想在任何地方使用它  在我的集成规范中。

我不想在每个规范中添加它的方法

目前我使用

 allow_any_instance_of(ApplicationController).to receive(:set_seo).and_return('seo_text')

但不方便。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

在您的Rspec配置中,您可以为:

配置前后块
  套件前的

     

之前

     

每个

之前      每次

     

毕竟

     

套件

之后

https://www.relishapp.com/rspec/rspec-core/v/2-2/docs/hooks/before-and-after-hooks

按顺序。

我建议:

RSpec.configure do |config|
  config.before(:suite) do
     allow_any_instance_of(ApplicationController).to receive(:set_seo).and_return('seo_text')
  end
end

编辑:

before(:suite)似乎可能会导致问题。

如果它不起作用,请使用before(:each)

答案 1 :(得分:0)

我会创建一个spec_helper_integration文件,并在其中放置特定于集成规范的功能。

您应该已经将require 'rails_helper'放在所有规格的顶部。在您的集成规范的顶部:

require 'rails_helper'
require 'spec_helper_integration'

然后在与spec_helper_integration.rb文件相同的文件夹中创建rails_helper.rb文件。

spec_helper_integration:

#I'm taking a guesstimate as to your integration spec configuration, but it's
#likely something like the following line:

#don't also have this in your spec_helper or rails_helper files:
require 'capybara/rails'

#configure your integration specs:
RSpec.configure do |config|
  config.before(:each) do
    allow_any_instance_of(ApplicationController).to receive(:set_seo).and_return('seo_text')
  end
end

将代码隔离到仅需要的位置是一种很好的做法;通过这样做,您的ApplicationController方法存根仅在集成规范的运行期间激活,而不是您的其他规范,例如单元或控制器规范。

继续前进,任何进一步的特定于集成规范的代码也应该只放在spec_helper_integration文件中。