ruby-on-rails - 如何使用无效的用户凭据实现 RSpec session Controller 测试

标签 ruby-on-rails authentication rspec devise tdd

我正在为我的 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/

相关文章:

c# - 在 Mongo .NET 2.0 驱动程序中捕获 MongoAuthenticationException

ruby-on-rails - 将redirect_to与特定的ActiveRecord对象一起使用来创建到该对象的链接

ruby-on-rails - 在 Rails 控制台中定义一个类(实例)方法

ruby-on-rails - Rails 4.2-如何在没有gem 'iconv'的情况下修复CSV导出中的ascii代码?

ruby - 在 Rspec 中测试抽象类

ruby-on-rails - 设计 View 规范

ruby-on-rails - rails 中 mock 和 stubs 的实际例子

ruby-on-rails - 为什么 "install"运行两次?

authentication - Flutter 中的 minLength 文本字段属性

asp.net - 设置动态验证表单loginUrl?