【问题标题】:How to reuse a context in RSpec?如何在 RSpec 中重用上下文?
【发布时间】:2014-01-06 17:13:08
【问题描述】:
我是 RSpec 的新手,我只是想知道如何在控制器中的多个操作中重用上下文。具体来说,我有这样的代码:
describe "GET index" do
context "when authorized" do
...
end
context "when unauthorized" do
it "denys access"
end
end
describe "GET show" do
context "when authorized" do
...
end
context "when unauthorized" do
it "denys access"
end
end
...
我想把它弄干一点。未经授权的上下文在每个操作上都是相同的,我该如何重用它?
【问题讨论】:
标签:
ruby-on-rails
ruby
rspec
dry
controllers
【解决方案1】:
分享的例子是你的朋友:
创建一个新文件,例如 spec/shared/unauthorized.rb 并将其包含在您的 spec_helper 中,然后将其格式化如下:
shared_examples_for "unauthorized" do
context "when unauthorized" do
it "denys access"
end
end
然后在您的规格中:
include_examples "unauthorized"
在每个描述块中都这样做,你应该是金子。
【解决方案2】:
如果你使用流行的 gem Devise,你可以像这样重用设计映射:
require "spec_helper"
describe Worksheet::CompanyController do
login_user_admin #<= this macros on /spec/support/controller_macros.rb
describe '#create' do
it 'admin login and create worksheet' do
post :create, worksheet_company: attributes_for(:"Worksheet::Company")
expect(response.status).to eq(302)
expect(response).to redirect_to(admin_root_path)
end
end
创建并登录 admin_user
spec/support/controller_macros.rb
module ControllerMacros
def login_user_admin
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user_admin]
user_admin = FactoryGirl.create(:user_admin)
user_admin.confirm!
sign_in user_admin
end
end
end
在spec/spec_helper.rb:
RSpec.configure do |config|
...
config.include Devise::TestHelpers, type: :controller
config.extend ControllerMacros, type: :controller
...
end