我正在为我的 SessionsController
编写 RSpec 测试。当使用有效凭据测试session#create
时,我的测试工作正常。但是,我还想针对用户凭据无效时发生的情况编写测试,例如重定向回登录页面、设置闪光警报等。但是对于这些测试中的任何一个,我出现错误:
1) SessionsController POST #create when password is INCORRECT
Failure/Error: post :create, user: {username: 'Example', password: ''}
ArgumentError:
uncaught throw :warden
# ./spec/support/default_params.rb:7:in `process_with_default_params'
# ./spec/controllers/sessions_controller_spec.rb:24:in `block (4 levels) in <top (required)>'
这是我的sessions_controller_spec.rb
代码:
require 'spec_helper'
describe SessionsController do
before do
@request.env["devise.mapping"] = Devise.mappings[:user]
end
describe 'POST #create' do
context "when password is INCORRECT" do
let!(:user) { FactoryGirl.create(:user, username: 'Example', password: 'Secr3t&$') }
before(:each) do
post :create, user: { username: 'Example', password: '' }
end
it { should set_the_flash[:alert].to('Invalid username or password.') }
it { should respond_with(:redirect) }
it { should redirect_to(:new_user_session) }
end
end
这是我的spec_helper.rb
代码:
RSpec.configure do |config|
config.include Devise::TestHelpers, type: :controller
end
任何帮助将不胜感激。谢谢!
最佳答案
我知道现在为时已晚,但以防万一这对其他人有帮助:您需要将 setup_controller_for_warden
添加到您的 before
block ,所以它变成:
before do
@request.env["devise.mapping"] = Devise.mappings[:user]
setup_controller_for_warden
end
此外,最好使用断言的翻译。在 rspec 3 格式中,断言应如下所示:
expect(flash[:alert]).to eq(I18n.t('devise.failure.invalid'))
关于ruby-on-rails - 如何使用无效的用户凭据实现 RSpec session Controller 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28572873/