当前位置: 首页 > 知识库问答 >
问题:

Rails, Devise, Rspec:未定义的方法sign_in

卓云
2023-03-14

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

我尝试过的事情:

  • 我将测试助手包括在Rspec中。配置
  • 使用典狱长的登录名作为
  • 正在清除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)>'

控制器规格

require 'spec_helper'

describe OrderItemsController do
    before (:each) do
        admin = create(:admin)
        sign_in :admin
    end

    describe "GET #index" do
        it "renders the :index view" do
            get :index
            expect( response ).to render_template :index
        end
    end
end

说明助手。铷

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

工厂/用户。铷

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

提前感谢。

共有3个答案

卢权
2023-03-14

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

等级库/等级库辅助对象。铷

 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

规范/集成/用户\流程\规范rb

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

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

凌和悦
2023-03-14

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

describe OrderItemsController, :type => :controller do

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

冷英光
2023-03-14

你最近有没有像我一样升级到RSpec 3?这来自RSpec 3文档:

自动添加元数据RSpec 3.0.0之前的版本根据元数据在文件系统中的位置自动将其添加到规格中。这对新用户来说是混乱的,对一些老用户来说是不可取的。

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

​# spec/rails_helper.rb
RSpec.configure do |config|
    config.infer_spec_type_from_file_location!
end

由于这种假定行为在教程中非常普遍,rails generate rspec:install生成的默认配置启用了这一功能。

如果遵循上面列出的规范目录结构,并配置了“从文件位置推断规范类型”!,RSpec将自动为每种类型提供正确的支持功能。

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

 类似资料:
  • Rails关联的基本问题如下表: 商店:名称,网络 产品:标题、价格、店铺id 关系定义为has_many并属于: 型号: shop.rb 产品rb型 控制器: shops\u控制器。rb型 products_controller.rb 在商店视图中,我设法参考并显示每个商店的所有产品,没有问题: 但另一方面,在产品视图中,我无法从Shop表中显示网络信息: 这将返回以下错误:

  • 我环顾了一下四周,但也许我找的地方不对。我试图找出如何测试用户无法访问其控制器具有以下功能的页面: 理想情况下,我希望同时捕获Desive信息: 到目前为止,我有这个 终止 目前我得到了错误 活动控制器 在我的规范助手中,我调用以下内容 控制器\u宏。铷 在这个阶段,我不称之为login_user方法,那么spec_helper会称之为这个吗? 我如何正确处理这个问题?

  • 我试过在本地迁移,然后推到heroku它没有工作。我尝试过heroku run rake DB:Migrate,然后重新启动它不起作用。 我试着重新启动dyno,它也没有工作。 有什么我可以查一下的可以提供更多的细节吗?我正在查看heroku run rake db:migrate:status,但它只显示了一般的迁移创建书籍。 Controllers/Books_Controller.rb

  • 我正在开发一个Rails应用程序,它有两个名称空间,分别是用于管理员的admin和用于移动设备的api 昨天发生了一件奇怪的事。我在我的PostgreSQL数据库中创建了一个新表,由id、name、created\u at、Update\u at组成。 我试图使用名称空间获取所有设施http://localhost:3000/admin/facilities它运行良好(返回HTML和工具列表)。

  • 我将Rails版本从3.2升级到4.2.6,并设计了从1.4.9到4.2.0的版本。当我使用创建更新密码运行我的应用程序时,一切都很好。但是当我将旧的生产数据库转储上传到新数据库并尝试重置密码时,我面临以下错误: 无方法错误(未定义的方法“reset_password_sent_at=” db/migrate/xxxxxxxx _ device _ create _ users . Rb: 旧迁移

  • Good day我不确定发生了什么我怀疑eclipse,但在UserDetailsServiceImpl中它是定义的,因为我实现了spring的UserDetails服务,下面是我的代码 这是让人头痛的一行“UserDetails UserDetails=userDetailsService.loadUserByUsername(username)”提前感谢您