devise + Rspec + render_view

时间:2015-12-17 15:02:12

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

我有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'

规格/控制器/ 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 spec / 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

的应用程序/控制器/ page_controller.rb

class PageController < ApplicationController
  def index
  end
end

如果我调用sign_in或sign_our方法测试成功。

1 个答案:

答案 0 :(得分:0)

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

这样做

before do
 sign_in_user
end

这将设置current_user对象。