Ruby on rails designe在rspec特性测试中的应用
我编写了以下rspec特性测试规范:Ruby on rails designe在rspec特性测试中的应用,ruby-on-rails,testing,rspec,devise,Ruby On Rails,Testing,Rspec,Devise,我编写了以下rspec特性测试规范: 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\u sign\u in方法在myrails\u h
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\u sign\u in
方法在myrails\u 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\u sign\u in
方法适用于我的所有控制器规格,但当我运行我的功能规格时,它会失败,原因是:
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'
我不明白为什么这在控制器测试中有效,而在功能测试中无效。在特性测试中,我可以做些什么来实现这一点吗
你尝试做的事情有一个基本问题。(设计
在典狱长
之上工作)典狱长
是
Rack
中间件,但RSpec
控制器规格甚至不包括Rack
,
因为这些类型的规范并不意味着要运行完整的应用程序
堆栈,但只有控制器代码
我有一个简单的支持助手,允许我登录和注销用户:
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
您是否将Auth放在spec/support/Auth.rb中?如果是,我如何将其包括在内,以使其可用于我的控制器和身份验证规范?我将
config.extend-Auth,type::controller
和config.extend-Auth,type::feature
添加到rails\u-helper.rb
。下面是当我尝试使用Auth运行测试时发生的情况:我认为您应该使用include
而不是extend
,这是不同的事情include
和extend
。如果我想在我的规范中访问@user变量,我应该使用include
?include用于添加方法(login\u和带有
的