2017-09-13 37 views
0

什麼是常規方法來設置一個變量,以供RSpec套件中的所有示例使用一次?爲RSpec套件中的所有示例設置變量一次(不使用全局變量)

我目前設置一個全局變量在spec_helper,檢查是否規範是在「調試模式」

$debug = ENV.key?('DEBUG') && (ENV['DEBUG'].casecmp('false') != 0) && (ENV['DEBUG'].casecmp('no') != 0) 

正在運行如何提供給套件中的所有例子此信息,而無需使用全局變量,而不需要重新計算每個上下文和/或示例的值? (我的理解是,使用before(:all)塊將每一次背景下重新計算它;但是,這before(:suite)不能用於設置實例變量。)

(注:我要求更多的瞭解良好的設計爲了解決這個問題,我知道一個全局並不是什麼大問題。)

回答

2

爲此我通常編寫自定義模塊,我可以在spec_helper.rb文件中包含這些模塊。

假設我正在測試後端API,並且我不想每次都解析JSON響應正文。

spec/ 
spec/spec_helper.rb 
spec/support/request_helper.rb 
spec/controllers/api/v1/users_controller_spec.rb 

我首先在放置在支持子文件夾下的模塊中定義一個函數。

# request_helper.rb 
module Request 
    module JsonHelpers 
    def json_response 
     @json_response ||= JSON.parse(response.body, symbolize_names: true) 
    end 
    end 
end 

然後我包括該模塊設定在某些測試類型

#spec_helper.rb 
#... 
RSpec.configure do |config| 
    config.include Request::JsonHelpers, type: :controller 
end 

然後我用在測試中定義的方法。

# users_controller_spec.rb 
require 'rails_helper' 

RSpec.describe Api::V1::UsersController, type: :controller do 
    # ... 

describe "POST #create" do 

    context "when is successfully created" do 
     before(:each) do 
     @user_attributes = FactoryGirl.attributes_for :user 
     post :create, params: { user: @user_attributes } 
     end 

     it "renders the json representation for the user record just created" do 
     user_response = json_response[:user] 
     expect(user_response[:email]).to eq(@user_attributes[:email]) 
     end 

     it { should respond_with 201 } 
    end 
end 

在你的情況,你可以創建一個模塊,如

module EnvHelper 
    def is_debug_mode? 
    @debug_mode ||= ENV['DEBUG'] 
    end 
end 

然後,可將它和簡單的使用方法is_debug_mode?在你的測試。