【发布时间】:2015-12-07 16:39:22
【问题描述】:
我正在使用 RSpec 来测试我对 Devise 和 simple_token_authentication gem 的混合实现。
我使用 devise_for 告诉 Devise 在哪里寻找我的会话控制器 (source)。
devise_for :users, controllers: {
registrations: 'users/devise/registrations',
sessions: 'users/devise/sessions'
}
在我的会话控制器中,如果请求具有特定标头 (source),我将调用自定义方法。
def create
req_from_coposition_app? ? respond_with_auth_token : super
end
def destroy
req_from_coposition_app? ? destroy_auth_token : super
end
我有一个测试可以确保用户可以获得一个身份验证令牌。 该请求按预期工作 (source)。
it "should be able to sign in" do
request.headers["X-Secret-App-Key"] = "this-is-a-mobile-app"
request.env['devise.mapping'] = Devise.mappings[:user]
post :create,
user: {
email: user.email,
password: user.password
},
format: :json
expect(res_hash[:email]).to eq user.email
expect(res_hash[:authentication_token]).to eq user.authentication_token
end
接下来,我想测试退出(销毁身份验证密钥)。 我正在尝试使用以下代码:
it "should be able to sign out" do
token_before = user.authentication_token
request.env['devise.mapping'] = Devise.mappings[:user]
request.headers["X-Secret-App-Key"] = "this-is-a-mobile-app"
request.headers["X-User-Token"] = token_before
delete :destroy, nil, format: :json
expect(user.reload.authentication_token).to_not eq token_before
end
但是,Users::Devise::SessionsController#destroy 永远不会被击中。
response.status 是 302,并且
response.body
#=> "<html><body>You are being <a href=\"http://test.host/\">redirected</a>.</body></html>"
我检查了 rake 路由,以不同的方式格式化了请求,并检查了 delete 方法没有被任何地方弄乱。我完全不知道为什么post :create 有效,但delete :destroy 没有采取行动。
【问题讨论】:
-
simple_token_authenticationREADME 示例显示了标头中的 X-User-Token 和 X-User-Email 字段。也许您还需要提供 X-User-Email?
标签: ruby-on-rails ruby rspec devise