在 rspec 功能测试中使用设计 [英] Using Devise in rspec feature tests

查看:17
本文介绍了在 rspec 功能测试中使用设计的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了以下 rspec 功能测试规范:

I've written the following rspec feature test spec:

require "rails_helper"

RSpec.describe "Team management", type: :feature do
  user_sign_in

  describe "User creates a new team" do
    ...    
    expect(page).to have_link("#{team_name}")
  end
end

user_sign_in 方法在我的 rails_helper.rb 中定义:

The user_sign_in method is defined in my rails_helper.rb:

ENV['RAILS_ENV'] ||= 'test'
require 'spec_helper'
require File.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
require 'capybara/rails'

...

module UserSignInHelpers
  def user_sign_in
    before(:each) do
      @request.env['devise.mapping'] = Devise.mappings[:user]

      @current_user = FactoryGirl.create(:user)
      @current_user.confirm

      sign_in :user, @current_user
    end
  end
end

RSpec.configure do |config|
  ...
  # The different available types are documented in the features, such as in
  # https://relishapp.com/rspec/rspec-rails/docs
  config.infer_spec_type_from_file_location!

  config.extend UserSignInHelpers,    type: :controller
  config.extend UserSignInHelpers,    type: :feature
  config.include Devise::TestHelpers, type: :controller
  config.include Devise::TestHelpers, type: :feature
end

user_sign_in 方法适用于我所有的控制器规范,但是当我运行我的功能规范时它失败了:

The user_sign_in method works from all of my controller specs but when I run my feature spec it fails with:

Team management
  User creates a new team
    example at ./spec/features/user_creates_a_new_team_spec.rb:19 (FAILED - 1)

Failures:

  1) Team management User creates a new team
     Failure/Error: Unable to find matching line from backtrace
     NoMethodError:
       undefined method `env' for nil:NilClass
     # /Users/xxxx/.rvm/gems/ruby-2.2.1/gems/devise-3.5.1/lib/devise/test_helpers.rb:24:in `setup_controller_for_warden'

我不明白为什么这适用于控制器测试而不是功能测试.在功能测试中,我可以做些什么来使这项工作发挥作用?

I don't understand why this works in controller tests and not feature tests. Is there something I can do make this work in feature tests?

推荐答案

您尝试执行的操作存在基本问题.(Devise 工作在 Warden 之上)Warden 是一个Rack 中间件,但 RSpec 控制器规范甚至不包括 Rack,因为这些类型的规范并不意味着运行你的完整应用程序堆栈,但只有您的控制器代码.

There is a basic problem with what you are trying to do. (Devise work on top of Warden)Warden is a Rack middleware, but RSpec controller specs don't even include Rack, as these types of specs are not meant to run your full application stack, but only your controller code.

参考

用 Capybara 测试

我有一个简单的支持助手,它允许我登录和注销用户:

I have a simple support helper, that allows me to login and logout users:

module Auth
  def create_user!
    @user = User.create(email: 'foo@bar.com', password: '11111111')
  end

  def sign_in_user!
    setup_devise_mapping!
    sign_in @user
  end

  def sign_out_user!
    setup_devise_mapping!
    sign_out @user
  end

  def setup_devise_mapping!
    @request.env["devise.mapping"] = Devise.mappings[:user]
  end

  def login_with_warden!
    login_as(@user, scope: :user)
  end

  def logout_with_warden!
    logout(:user)
  end

  def login_and_logout_with_devise
    sign_in_user!
    yield
    sign_out_user!
  end

  def login_and_logout_with_warden
    Warden.test_mode!
    login_with_warden!
    yield
    logout_with_warden!
    Warden.test_reset!
  end
end

在功能中:

RSpec.describe "Team management", type: :feature do
  describe "User creates a new team" do
     login_and_logout_with_warden do
       # tests goes here
     end
  end
end

在控制器中:

RSpec.describe "Team management", type: :controller do
  describe "User creates a new team" do
    login_and_logout_with_devise do
      # tests goes here
    end
  end
end

这篇关于在 rspec 功能测试中使用设计的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆