在 Devise + Rspec + render_view 上定义方法"身份验证"



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

Gemfile

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

规范/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规范/controllers/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_our方法,则测试是成功的。

在渲染之前需要调用sign_in方法,因为它检查current_user对象并调用authenticate!方法在current_user对象上,该对象为零,因此抛出错误!

像这个吗

before do
 sign_in_user
end

这将设置currentuser对象。

最新更新