带水豚的设备登录验收测试

问题描述 投票:1回答:1

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

我正在尝试测试使用devise的自定义登录表单。环境包括

  • rails 6.0
  • rspec-rails 3.9
  • 水豚3.31
  • selenium-webdriver 3.142.7
  • database_cleaner 1.8
  • 以下规格由于401 Unauthorized响应而失败,再次显示登录信息并显示错误消息,提示凭据错误。

require 'rails_helper'

feature 'Logging in' do
  background do
    FactoryBot.create :user, email: '[email protected]',
                             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: '[email protected]'
      find('#user_password').fill_in with: 'password'
    end

    find('input[name="commit"]').click
    expect(page).to have_content 'John'
  end
end

暂时禁用参数过滤器以进行日志记录后,[test.log的检查,我可以看到密码已正确提交,并且在尝试登录之前已经创建了用户,但认证失败。进入交互式调试会话并尝试在水豚的启动浏览器中手动登录,登录也会失败。通过控制台创建同一用户时,电子邮件/密码登录在开发模式下有效。目前,没有使用其他可能影响登录行为的设计功能(例如confirmable)。

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

禁用交易固定装置:

我的rails_helper.rb已包含此内容;
RSpec.configure do |config|
  config.use_transactional_fixtures = false
end

配置数据库清洁程序:

Failing to test Devise with 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

现在,我没有其他想法,为什么这种情况可能会失败,除了可能在具有适当的数据库连接的情况下进行热测试的环境之外。如果有人有帮助的想法,我很乐意听到。

关于stackoverflow已经有一些问题,有可能的解决方案,但是似乎没有一个问题可以解决我的问题,因此,我要再问一个问题,希望它足够具体,不要以...结尾]。 [

[当使用Rails> 5.0时,它将安全地共享测试与被测Capybara启动的应用之间的数据库连接。因此,您不需要数据库清理程序,而应该使用事务测试来获得速度和隔离优势。首先从项目中删除对数据库清理程序的所有引用,然后重新启用事务处理固定装置(默认设置)。如果那不能解决您的问题,那么还有其他两个潜在问题。

  1. 您的工厂没有创建有效的用户-在测试之前,请使用FactoryBot.lint功能验证所有工厂产生的有效对象-https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#linting-factories

  • 您的页面上出现JS错误,导致出现问题。在开发模式下,每个JS资产都单独提供,这意味着其中一个错误不会影响其他资产。但是,在测试模式下,资产全部串联在一起,这意味着一个资产中的错误可能导致其他资产中的JS无法运行。检查您的浏览器控制台中是否有任何JS错误,并进行修复。
  • 如果没有帮助,请在您的问题中添加test.log的相关部分

    注意:您编写的测试比所需的要冗长。如果通过id将字段填充为fill_in,则只需将id传递给fill_in,而不必为每个元素使用单独的find调用,则当您尝试点击该元素时,还应该使用更具语义的click_button符合按钮的资格]

    within('#user-sessions--new') do fill_in 'user_email', with: '[email protected]' fill_in 'user_password', with: 'password' end click_button('commit') expect(page).to have_content 'John'

    ruby-on-rails devise capybara rspec-rails
    1个回答
    0
    投票
    [当使用Rails> 5.0时,它将安全地共享测试与被测Capybara启动的应用之间的数据库连接。因此,您不需要数据库清理程序,而应该使用事务测试来获得速度和隔离优势。首先从项目中删除对数据库清理程序的所有引用,然后重新启用事务处理固定装置(默认设置)。如果那不能解决您的问题,那么还有其他两个潜在问题。
    © www.soinside.com 2019 - 2024. All rights reserved.