【发布时间】:2015-11-28 04:58:40
【问题描述】:
我将 Devise 用于我的用户登录和东西,并使用 rspec 进行测试。我已经查看了 rspec 的设计测试指南,并将 ControllerMicros 混合到控制器规格中。 如果我有这样组织的测试,实际上一切都很好:
describe 'GET #index' do
context 'user logged in but not admin' do
login_user
it 'should redirect to root_path for non_user' do
get :index
// I have asserted that the current_user here is not nil
expect(response).to redirect_to(root_path)
end
end
end
但是,如果我在上下文中有 2 个测试并且我得到 current_user is nil 用于非第一个测试。
describe 'GET #index' do
context 'user logged in but not admin' do
login_user
it 'should redirect to root_path for non_user' do
get :index
// I have asserted that the current_user here is not nil
expect(response).to redirect_to(root_path)
end
it 'should do some other thing' do
get :index
// the current_user method returns nil here
expect(response).to redirect_to(root_path)
end
end
end
最糟糕的是,这个问题似乎不是确定性的:发生得有点随机——因为在几次失败的运行之后,套件刚刚通过我的电脑(但在 Travis my build 上仍然失败)
一些附加信息:
ControllerMacro.rb
module ControllerMacros
def login_admin
before(:each) do
# @request.env["devise.mapping"] = Devise.mappings[:user]
user = User.find_by(email: 'default_admin@controller.spec')
user ||= FactoryGirl.create(:user, email: 'default_admin@controller.spec', uid: 'default_admin.controller.spec')
admin = Admin.find_by(user_id: user.id)
FactoryGirl.create(:admin, user: user) if not admin
sign_in user
end
end
def login_user(user = nil)
before(:each) do
# @request.env["devise.mapping"] = Devise.mappings[:user]
user ||= User.find_by(email: 'default_user@controller.spec')
user ||= FactoryGirl.create(:user, email: 'default_user@controller.spec', uid: 'default_user.controller.spec')
sign_in user
end
end
end
rails_helper.rb
RSpec.configure do |config|
# for loading devise in test
config.include Devise::TestHelpers, :type => :controller
config.extend ControllerMacros, :type => :controller
end
【问题讨论】:
标签: ruby-on-rails ruby rspec devise