Ruby on rails 用capybara设计登录验收测试

Ruby on rails 用capybara设计登录验收测试,ruby-on-rails,devise,capybara,rspec-rails,Ruby On Rails,Devise,Capybara,Rspec Rails,关于stackoverflow已经有了一些问题和可能的解决方案,但似乎没有一个能解决我的问题,因此我要问另一个问题,希望它足够具体,不会重复 我正在尝试测试一个使用Desive的定制登录表单。环境包括 rails 6.0 rspec轨道3.9 水豚3.31 selenium webdriver 3.142.7 数据库清理器1.8 由于401未经授权的响应,以下规范失败,再次呈现登录表单并显示错误消息,提示凭据错误 require 'rails_helper' feature 'Loggin

关于stackoverflow已经有了一些问题和可能的解决方案,但似乎没有一个能解决我的问题,因此我要问另一个问题,希望它足够具体,不会重复

我正在尝试测试一个使用Desive的定制登录表单。环境包括

  • rails 6.0
  • rspec轨道3.9
  • 水豚3.31
  • selenium webdriver 3.142.7
  • 数据库清理器1.8
由于
401未经授权的
响应,以下规范失败,再次呈现登录表单并显示错误消息,提示凭据错误

require 'rails_helper'

feature 'Logging in' do
  background do
    FactoryBot.create :user, email: 'john.doe@example.com',
                             first_name: 'John',
                             password: 'password',
                             password_confirmation: 'password'
  end

  scenario 'with correct credentials' do
    visit new_user_session_path

    within('#user-sessions--new') do
      find('#user_email').fill_in with: 'john.doe@example.com'
      find('#user_password').fill_in with: 'password'
    end

    find('input[name="commit"]').click
    expect(page).to have_content 'John'
  end
end
检查
test.log
在临时禁用用于记录的参数过滤器后,我可以看到密码已正确提交,并且在尝试登录之前创建了用户,但身份验证失败。进入交互式调试会话并尝试在capybara的旋转浏览器中手动登录,登录也会失败。不过,当通过控制台创建同一用户时,电子邮件/密码登录在开发模式下工作。目前,没有使用任何其他可能影响登录行为的Desive功能(如
confirmable

到目前为止,我发现的大多数问题都有以下几点建议:

禁用事务性装置:My
rails\u helper.rb
已包含此项

RSpec.configure do |config|
  config.use_transactional_fixtures = false
end
配置数据库清理器:这是在中建议的,在我开始实施capybara规范之前也是这样

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(
      :truncation,
      except: %w[ar_internal_metadata schema_migrations]
    )
  end

  config.before :each do
    DatabaseCleaner.start
  end

  config.after :each do
    DatabaseCleaner.clean
  end
end

现在我不知道为什么这个场景会失败,除了测试运行的环境有一个正确的数据库连接之外。如果有人有帮助的想法,我很乐意听到。

当使用Rails>5.0时,它会安全地在测试和正在测试的应用程序Capybara启动之间共享数据库连接。正因为如此,您不需要数据库清洁器,并且应该使用事务测试来提高速度和隔离度。首先从项目中删除对database cleaner的所有引用,并重新启用事务性装置(默认设置)。如果这不能解决你的问题,那么还有一些其他潜在的问题

  • 您的工厂没有创建有效的用户-请在测试之前使用FactoryBot.lint功能验证所有工厂是否生成有效的对象-

  • 您的页面上出现JS错误,导致出现问题。在开发模式中,每个JS资产都是单独提供的,这意味着其中一个资产中的错误不会影响其他资产。然而,在测试模式下,所有资产都是串联的,这意味着其中一个资产中的错误可能导致其他资产中的JS无法运行。检查您的浏览器控制台是否存在任何JS错误并修复它们

  • 如果这些都没有帮助,请将test.log的相关部分添加到问题中

    注意:您编写的测试比需要的更详细。如果通过id定位要填写的字段,您只需将id传递给
    fill\u in
    ,而不需要对每个元素使用单独的
    find
    调用,当您尝试单击的元素符合按钮条件时,您还应使用语义更丰富的
    click\u按钮

     within('#user-sessions--new') do
      fill_in 'user_email', with: 'john.doe@example.com'
      fill_in 'user_password', with: 'password'
    end
    
    click_button('commit')
    expect(page).to have_content 'John'
    

    使用User.create方法而不是FactoryBot方法创建用户时会发生什么情况?@3DPrintScanner有同样的问题。根据日志将用户插入数据库,但身份验证仍然失败。我还检查了测试内部是否有可用的用户,测试运行时用户肯定在那里。我还在开发控制台中创建了用户,与在测试环境中创建用户的方式相同,并且登录在那里工作。删除数据库清理器并启用事务设备解决了这个问题!因为尽管id和名称正确,但由于未知原因,
    用户密码
    没有被填充,所以填充的内容越详细。@pduersteler很高兴它能起作用,那么使用较少的
    填充内容
    ,您到底遇到了什么错误?根本没有填充密码,只有密码字段。