我在我的 rspec 控制器测试中参数化 shared_example 时遇到问题。我的代码基于将示例传递给共享组,如 Relish 中所述
从表面上看,似乎在 shared_context 中创建的实例变量在 shared_examples 中不可用。有任何想法吗?
我正在使用带有 CanCan 和 Devise gems 的 Rails 3.1。
控制器(app/controllers/stores_controller.rb):
class StoresController < SubDomainController
def index
authorize! :list, Store
@stores = current_user.company.stores.allrespond_to do |format|
format.html # index.html.erb
format.json { render json: @stores }
end
end
end
共享模块(spec/support/shared.rb):
module Shared
shared_context "stores controller" do
before :all do
build_companies
build_stores
build_users
end
end
shared_context "admin logged in" do
before :each do
login_admin
end
end
#########THIS IS THE TEST THAT IS FAILING#########
shared_examples "authorised_user" do |values|
it "should assign correct variables" do
values.each do |key,val|
assigns[key].should == values[key]
end
end
end
end
助手模块(spec/support/helpers.rb):
module Helpers
def build_companies
@company = build_company(get_rand_string() ,"Correct")
@other_company = build_company(get_rand_string() ,"Invalid")
end
def build_stores
@store = FactoryGirl.create(:store, :company_id => @company.id)
@other_store = FactoryGirl.create(:store, :company_id => @company.id)
@other_company_store = FactoryGirl.create(:store, :company_id => @other_company.id)
end
def build_users
@admin_user = FactoryGirl.create(:user, :role_id => 1, :company => @company, :store_id => @store.id)
@manager_user = FactoryGirl.create(:user, :role_id=> 2, :company => @company, :store_id => @store.id)
@regular_user = FactoryGirl.create(:user, :role_id=> 3, :company => @company, :store_id => @store.id)
end
end
规范助手(spec/spec_helper.rb):
.....
config.include Helpers
config.include Shared
....
控制器规范(spec/controllers/stores_controller_spec.rb):需要“spec_helper”
describe StoresController do
include_context "stores controller"
describe "INDEX" do
[:admin].each do |u|
describe "#{u} authorised" do
include_context "#{u} logged in"
before :each do
get :index
end
###passing instance variables to Helper module not working######
it_behaves_like "authorised_user", {:stores => [@store, @other_store]}
end
end
end
end
end
错误:
1) StoresController INDEX company stores admin authorised behaves like authorised_user should assign correct variables
Failure/Error: assigns[key].should == values[key]
expected: [nil, nil]
got: [#<Store id: 1, company_id: 1, location_name: "MyString", address: "MyString", created_at: "2012-06-18 05:29:19", updated_at: "2012-06-18 05:29:19">, #<Store id: 2, company_id: 1, location_name: "MyString", address: "MyString", created_at: "2012-06-18 05:29:19", updated_at: "2012-06-18 05:29:19">] (using ==)
Diff:
@@ -1,2 +1,3 @@
-[nil, nil]
+[#<Store id: 1, company_id: 1, location_name: "MyString", address: "MyString", created_at: "2012-06-18 05:29:19", updated_at: "2012-06-18 05:29:19">,
+ #<Store id: 2, company_id: 1, location_name: "MyString", address: "MyString", created_at: "2012-06-18 05:29:19", updated_at: "2012-06-18 05:29:19">]