【问题标题】:undefined method `authenticate' on Devise + Rspec + render_viewDevise + Rspec + render_view上的未定义方法“authenticate”
【发布时间】:2015-12-17 15:02:12
【问题描述】:

我有 Rails 4.2.5 和 rspec 3.4.1 当我添加 render_views 时,一些第一个控制器测试失败。 我使用 render_views 是因为我不知道任何方法可以查看页面上发生的情况。

宝石文件

source 'https://rubygems.org'
gem 'rails', '4.2.5'
gem 'sqlite3'
gem 'haml-rails', '~> 0.9'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'twitter-bootstrap-rails'
gem 'less-rails'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
group :development, :test do
  gem 'rspec-rails', '~> 3.0'
  gem 'cucumber-rails', :require => false
  gem 'database_cleaner'
  gem 'factory_girl_rails'
  gem 'shoulda-matchers'
  gem 'capybara'
  gem 'capybara-screenshot'
  gem 'byebug'
end
group :development do
  gem 'web-console', '~> 2.0'
  gem 'spring'
end
gem 'devise'
gem 'cancan'
gem "role_model"
gem 'paperclip', '~> 4.3'
gem 'jquery-fileupload-rails'
gem 'stringex'
gem 'will_paginate'
gem 'russian', '~> 0.6.0'

spec/controllers/users_controller_spec.rb

RSpec.describe UsersController, type: :controller do
  render_views
  let(:valid_attributes) {
    {email: "admin@example.com",
    password: "password",
    password_confirmation: "password"}
  }
  let(:invalid_attributes) {
  }
  let(:valid_session) { {} }

  describe "GET #index" do
    it "says 'Users'" do
      get :index
    end
  end
  ...

end

spec/rails_helper.rb

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?

require 'spec_helper'
require 'rspec/rails'
require 'devise'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.include Devise::TestHelpers, type: :controller
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
end

rspec 规范/控制器/page_controller_spec.rb

PageController
  GET #index
    returns http success (FAILED - 1)

Failures:

  1) PageController GET #index returns http success
     Failure/Error: - if user_signed_in?
     
     ActionView::Template::Error:
       undefined method `authenticate' for nil:NilClass
     # /home/ilp/.rvm/gems/ruby-2.1.4/gems/devise-3.5.3/lib/devise/controllers/helpers.rb:124:in `current_user'
     # /home/ilp/.rvm/gems/ruby-2.1.4/gems/devise-3.5.3/lib/devise/controllers/helpers.rb:120:in `user_signed_in?'
     # ./app/views/layouts/main.html.haml:36:in `_app_views_layouts_main_html_haml___2814915178728912122_59040000'
     # ./spec/controllers/page_controller_spec.rb:11:in `block (3 levels) in <top (required)>'
     # ------------------
     # --- Caused by: ---
     # NoMethodError:
     #   undefined method `authenticate' for nil:NilClass
     #   /home/ilp/.rvm/gems/ruby-2.1.4/gems/devise-3.5.3/lib/devise/controllers/helpers.rb:124:in `current_user'

Finished in 0.26407 seconds (files took 1.9 seconds to load)
1 example, 1 failure

app/controllers/page_controller.rb

class PageController < ApplicationController
  def index
  end
end

如果我调用 sign_in 或 sign_我们的方法测试成功。

【问题讨论】:

  • 显示您的控制器index 操作。
  • 已更新。我想向所有人展示这个页面,也包括未签名的用户。
  • 解决了 rspec 的存根身份验证问题:github.com/plataformatec/devise/wiki/…

标签: ruby-on-rails rspec devise views render


【解决方案1】:

您需要在渲染之前调用 sign_in 方法,因为它会检查 current_user 对象并调用身份验证! current_user 对象上的方法是 nil 所以抛出错误!

这样做

before do
 sign_in_user
end

这将设置 current_user 对象。

【讨论】:

  • 我不需要唱歌。我想在没有签名用户的情况下运行。
  • 您在 PageController 上有 before_filter。如果您不需要它,请在页面控制器中添加 skip_before_filter 或在 rspec 中存根 current_user 对象!
  • 谢谢。根据您的想法,我发现:github.com/plataformatec/devise/wiki/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多