16

我想在我的规格之间分享一个记忆的方法。所以我尝试使用这样的共享上下文

RSpec.configure do |spec|
  spec.shared_context :specs do
    let(:response) { request.execute! }
  end
end

describe 'something' do
  include_context :specs
end

它工作正常。但是我有大约 60 个规范文件,所以我不得不在每个文件中明确地包含上下文。有没有办法为所有示例组自动包含共享上下文(或至少let定义)spec_helper.rb

像这样的东西

RSpec.configure do |spec|
  spec.include_context :specs
end
4

5 回答 5

31

您可以通过configure-class-methodsConfiguration设置全局before挂钩:RSpec.configure

RSpec.configure {|c| c.before(:all) { do_stuff }}

let中不支持RSpec.configure,但您可以let通过将其包含在SharedContext 模块中并使用以下方法包含该模块来设置全局config.before

module MyLetDeclarations
  extend RSpec::Core::SharedContext
  let(:foo) { Foo.new }
end
RSpec.configure { |c| c.include MyLetDeclarations }
于 2012-07-01T18:30:19.403 回答
5

几乎可以这样做:有一个包含模块的机制,模块包含有它自己的回调机制。

例如,假设我们有一个disconnected共享上下文,我们想用它来运行我们所有的模型规范,而无需数据库连接。

shared_context "disconnected"  do
  before :all do
    ActiveRecord::Base.establish_connection(adapter: :nulldb)
  end

  after :all do
    ActiveRecord::Base.establish_connection(:test)
  end
end

您现在可以创建一个模块,该模块将在包含时包含该上下文。

module Disconnected
  def self.included(scope)
    scope.include_context "disconnected"
  end
end

最后,您可以以正常方式将该模块包含到所有规范中(我已经演示了仅对模型执行此操作,只是为了表明您可以),这几乎正是您所要求的。

RSpec.configure do |config|
  config.include Disconnected, type: :model
end

这适用于rspec-core2.13.0 和rspec-rails2.13.0。

于 2013-03-07T11:36:26.293 回答
5

在 RSpec 3+ 中,这可以通过以下方式实现 - 基于 Jeremy Peterson 的回答。

# spec/supprt/users.rb
module SpecUsers
  extend RSpec::SharedContext

  let(:admin_user) do
    create(:user, email: 'admin@example.org')
  end
end

RSpec.configure do |config|
  config.include SpecUsers
end
于 2015-06-26T07:14:05.970 回答
2

另一种方法是通过元数据自动共享示例。所以:

shared_context 'a shared context', a: :b do
  let(:foo) { 'bar' }
end

describe 'an example group', a: :b do
  # I have access to 'foo' variable
end

我使用它的最常见方式是在 rspec-rails 中,根据示例组类型使用一些共享上下文。所以如果你有config.infer_spec_type_from_file_location!,你可以简单地做:

shared_context 'a shared context', type: :controller do
  let(:foo) { 'bar' }
end

describe SomeController do
  # I have access to 'foo' variable
end
于 2015-06-02T06:54:56.380 回答
0

此外,如果您需要像我一样在规范内的块中使用共享数据的能力before,请尝试包含此内容(如果它的 Rails 项目):

module SettingsHelper
  extend ActiveSupport::Concern

  included do
    attr_reader :default_headers

    before :all do
      @default_headers = Hash[
          'HTTP_HOST' => 'test.lvh.me'
        ]
    end

    after :all do
      @default_headers = nil
    end
  end
end

RSpec.configure do |config|
  config.include SettingsHelper
end

或者尝试类似的东西,看看@threedaymonk 的答案。

于 2015-01-08T10:18:40.060 回答