Ruby on rails 4 Rails,Desive,Rspec:未定义的方法';登录&x27;

Ruby on rails 4 Rails,Desive,Rspec:未定义的方法';登录&x27;,ruby-on-rails-4,rspec,devise,Ruby On Rails 4,Rspec,Devise,我尝试在Rails中编写Rspec测试,使用Desive助手方法进行登录和注销。“登录”方法不起作用。然而,在对应用程序进行大量更改之前,它就已经开始工作了 我尝试过的事情: 我正在Rspec.configure中包含测试助手 使用典狱长的登录名作为 正在清除Rails缓存 除掉水豚,看看这是否是问题的根源 我没有在控制器规范中明确设置会话(例如,没有有效的\u会话) 到目前为止,还没有骰子。使用已登录用户测试控制器需要做哪些不同的操作 错误消息: OrderItemsController

我尝试在Rails中编写Rspec测试,使用Desive助手方法进行登录和注销。“登录”方法不起作用。然而,在对应用程序进行大量更改之前,它就已经开始工作了

我尝试过的事情:

  • 我正在Rspec.configure中包含测试助手
  • 使用典狱长的登录名作为
  • 正在清除Rails缓存
  • 除掉水豚,看看这是否是问题的根源
  • 我没有在控制器规范中明确设置会话(例如,没有有效的\u会话)
到目前为止,还没有骰子。使用已登录用户测试控制器需要做哪些不同的操作

错误消息:

 OrderItemsController GET #index renders the :index view
 Failure/Error: sign_in :admin
 NoMethodError:
      undefined method `sign_in' for #  <RSpec::ExampleGroups::OrderItemsController_2::GETIndex:0x00000102c002d0>
 # ./spec/controllers/order_items_controller_spec.rb:6:in `block (2 levels) in <top (required)>'
spec_helper.rb

require 'rspec/rails'
require 'capybara/rspec'

RSpec.configure do |config|

  config.include ApplicationHelper
  config.include ControllersHelper
  config.include UsersHelper
  config.include Devise::TestHelpers, type: :controller
  config.include FactoryGirl::Syntax::Methods

end
Gemfile

group :development, :test do
    gem 'rspec-rails', '~> 3.0.0.beta'
    gem 'capybara'
    gem 'factory_girl_rails'
    gem 'faker'
    gem 'dotenv-rails'
    gem 'guard'
    gem 'guard-annotate'
    gem 'guard-rspec', require: false
    gem 'guard-livereload', require: false
    gem 'foreman'
end
工厂/user.rb

FactoryGirl.define do

    factory :user do
        first                   { Faker::Name.first_name }
        last                    { Faker::Name.last_name }
        email                   { Faker::Internet.email }
        admin                   false
        password                "secrets1"
        password_confirmation   "secrets1"
        confirmed_at            Date.today

        factory :admin do
            admin               true
        end
    end
end

提前感谢。

我可以为您提供一个示例(适用于我-rspec/capybara/simplecov等)

spec/spec\u helper.rb

 require 'capybara/rspec'
 require 'capybara/rails'

 RSpec.configure do |config|
  config.use_transactional_fixtures = true

  config.infer_base_class_for_anonymous_controllers = false

  config.include FactoryGirl::Syntax::Methods
  config.include Devise::TestHelpers, type: :controller
  config.include Capybara::DSL
  config.include Warden::Test::Helpers
  config.include Rails.application.routes.url_helpers
end
require 'spec_helper'

feature 'Verify contract' do
  # Create employee
  let(:employee) { create(:employee) }
  let (:book) { create(:book) }

  # Sign in employee before each test!
  before :each do
    login_as employee, scope: :user
  end

  scenario 'create book' do
    # Visit Index and click to create
    visit employee_books_path
    click_link 'Create'
    expect(current_path).to eq(employee_books_path)
  end
end
spec/integration/user\u flow\u spec.rb

 require 'capybara/rspec'
 require 'capybara/rails'

 RSpec.configure do |config|
  config.use_transactional_fixtures = true

  config.infer_base_class_for_anonymous_controllers = false

  config.include FactoryGirl::Syntax::Methods
  config.include Devise::TestHelpers, type: :controller
  config.include Capybara::DSL
  config.include Warden::Test::Helpers
  config.include Rails.application.routes.url_helpers
end
require 'spec_helper'

feature 'Verify contract' do
  # Create employee
  let(:employee) { create(:employee) }
  let (:book) { create(:book) }

  # Sign in employee before each test!
  before :each do
    login_as employee, scope: :user
  end

  scenario 'create book' do
    # Visit Index and click to create
    visit employee_books_path
    click_link 'Create'
    expect(current_path).to eq(employee_books_path)
  end
end

我希望一切都会好起来:)我想你的问题是找不到狱长测试助手…

我想出了一个解决办法。我将控制器的descripe块显式定义为控制器类型

describe OrderItemsController, :type => :controller do

我仍然不明白为什么这段代码以前可以工作,但现在需要这个(看似多余的)显式声明。不管怎样,我很想知道这里发生了什么。谢谢

您最近是否像我一样升级到RSpec 3?这是来自:

自动添加元数据 3.0.0之前的RSpec版本会根据 它们在文件系统上的位置。这既让新用户感到困惑,也让他们感到困惑 对于一些老用户来说是很理想的

在RSpec 3中,必须显式启用此行为:

​# spec/rails_helper.rb
RSpec.configure do |config|
    config.infer_spec_type_from_file_location!
end
由于这种假定行为在教程中非常普遍,因此默认 由rails生成的配置生成rspec:install启用此功能

如果遵循上面列出的规范目录结构,并且 已配置从文件位置推断规格类型!,RSpec将自动 包括每种类型的正确支持功能


添加该配置片段后,我不再需要指定规范类型(例如,
type::controller
)。

您可以使用spec/spec\u helper.rb文件中的designe helper:

RSpec.configure do |config|
   config.include Devise::TestHelpers, type: :controller
end

对于Rails 5和Rspec 3,您需要将其添加到spec_helper.rb中

require 'rspec/rails'
require 'capybara/rspec'

RSpec.configure do |config|

  config.include ApplicationHelper
  config.include ControllersHelper
  config.include UsersHelper
  config.include Devise::TestHelpers, type: :controller
  config.include FactoryGirl::Syntax::Methods

end
config.include designe::Test::ControllerHelpers,type::controller


如果在请求规范文件中需要
登录
方法,则应包括以下内容:

config.include Devise::Test::IntegrationHelpers, type: :request

现在它说的是未定义的方法“get”和“post”,所以我不知道您的答案是否绕过了我的问题。再说一次,所有这些都在早些时候起了作用,这很奇怪。@steel,你在这里的评论帮助我意识到我确实和你在同一条船上,因此你的回答也对我起了作用。展示你的spec_助手帮助了我。它起作用了。谢谢。谢谢你的回答,帮助了我。我将从Rails 4升级到4.1。你呢?我会检查控制器测试指南,如果我发现了什么,我会在这里提到。仍然在Rails 4.0.3上。谢谢你看。我想我找到了。请看我的答案。