将一个变量设置为RSpec套件中所有示例的常规方法是什么?
我目前在spec_helper
中设置了一个全局变量,用于检查规范是否以"调试模式运行"
$debug = ENV.key?('DEBUG') && (ENV['DEBUG'].casecmp('false') != 0) && (ENV['DEBUG'].casecmp('no') != 0)
如何在不使用全局变量且不重新计算每个上下文和/或示例的值的情况下,将此信息提供给套件中的所有示例? (我的理解是,使用before(:all)
块会在每个上下文中重新计算一次;但是,before(:suite)
不能用于设置实例变量。)
(注意:我要求更多地了解解决这一特定问题的优秀设计。我知道一个全球性并不重要。)
答案 0 :(得分:3)
为此,我通常编写可以包含在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?
。