我正在使用Rails 5和Devise 3.5.1.
阅读一本关于创建/测试API的好(旧)书,该书使用Devise身份验证.它是在Rails 5之前编写的,所以我选择不使用新的api-only版本.
这是我的测试......
#/spec/controllers/api/v1/users_controller_spec.rb
require 'rails_helper'
describe Api::V1::UsersController, :type => :controller do
before(:each) { request.headers['Accept'] = "application/vnd.marketplace.v1" }
describe "GET #show" do
before(:each) do
@user = FactoryGirl.create :user
get :show, params: {id: @user.id}, format: :json
end
it "returns the information about a reporter on a hash" do
user_response = JSON.parse(response.body, symbolize_names: true)
expect(user_response[:email]).to eql @user.email
end
it { should respond_with 200 }
end
end
Run Code Online (Sandbox Code Playgroud)
这是一个完全出乎意料的RSpec错误
Devise::MissingWarden:
Devise could not find the `Warden::Proxy` instance on your request environment. …Run Code Online (Sandbox Code Playgroud) 我能够使用Devise的sign_in方法在我的控制器规范中登录用户.但是现在我正在从我的应用程序中删除Devise,我不太确定如何使用Warden自己的类似功能.
我应该如何设置spec/spec_helper.rb和相关spec/support/*.rb文件以使Warden在控制器规格内充分运行?
我已尝试spec/support/warden.rb使用以下内容设置文件:
RSpec.configure do |config|
config.include Warden::Test::Helpers
config.after do
Warden.test_reset!
end
end
Run Code Online (Sandbox Code Playgroud)
然后我有before类似的调用来验证user工厂:
before { login_as FactoryGirl.create(:user) }
Run Code Online (Sandbox Code Playgroud)
但这是我一直看到的错误:
NameError:
undefined method `user' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
此错误追溯到authenticate_user!控制器中的方法:
def authenticate_user!
redirect_to login_path, notice: "You need to sign in or sign up before continuing." if env['warden'].user.nil?
end
Run Code Online (Sandbox Code Playgroud)
我很感激任何人都可以提供的任何指导.