rspec shared_context и include_context для всех спецификаций - PullRequest
0 голосов
/ 01 апреля 2012

Я пытаюсь определить несколько хуков let и before, которые будут работать глобально для всех моих спецификаций, включив их в отдельный файл, используя блок конфигурации Rspec .

Я пробовал что-то вроде:

module Helpers
  def self.included(base)
    base.let(:x){ "x" }
    base.before(:all){ puts "x: #{x}" }
  end
end

Rspec.configure{|c| c.include Helpers }

, но это не работает, как ожидалось.before(:all) не только запускается перед каждой основной группой примеров, но и каждой вложенной.

Затем я узнал о shared_context , и, похоже, это именно то, что я хочу.

Однако моя открытая проблема заключается в том, что я не могу понять, как разделить контекст среди ALL моих спецификаций.Документы ссылаются только на include_context в пределах конкретной спецификации.

Может кто-нибудь сказать мне, как я могу добиться такого поведения в глобальном масштабе?Я знаю, что я могу определить глобальные до хуков в моем spec_helper, но я не могу использовать let.Мне бы хотелось одно место, где я мог бы определить обе эти вещи и не загрязнять моего помощника по спецификациям, а просто включить его вместо этого.

1 Ответ

2 голосов
/ 02 апреля 2012

Я пытался воспроизвести вашу ошибку, но не смог.

# spec_helper.rb
require 'support/global_helpers'

RSpec.configure do |config|
  config.include MyApp::GlobalHelpers
end

# support/global_helpers.rb
module MyApp
  module GlobalHelpers
    def self.included(base)
      base.let(:beer) { :good }
      base.before(:all) { @bottles = 10 }
    end
  end  
end

# beer_spec.rb
require 'spec_helper'

describe "Brewery" do

  it "makes good stuff" do
    beer.should be :good
  end

  it "makes not too much bottles" do
    @bottles.should == 10
  end

  context "when tasting beer" do
    before(:all) do
      @bottles -= 1
    end

    it "still produces good stuff" do
      beer.should be :good
    end

    it "spends some beer on degusting" do
      @bottles.should == 9
    end   
  end
end

https://gist.github.com/2283634

Когда я написал что-то вроде base.before(:all) { p 'global before'; @bottles = 10 }, я получил ровно одну строку в выводе спецификации.

Обратите внимание, что я не пытался изменить переменные экземпляра внутри примера, потому что это не сработало бы в любом случае (ну, на самом деле, вы можете изменить переменные экземпляра, еслиэто хеш или массив).Более того, даже если вы измените before(:all) во вложенной группе примеров на before(:each), в каждом примере все равно будет 9 бутылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...