设计水豚登录验收测试



堆栈溢出上已经有几个问题以及可能的解决方案,但它们似乎都没有解决我的问题,因此我问另一个问题,希望它足够具体,不会因重复而关闭。

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

  • 导轨 6.0
  • RSPEC-导轨 3.9
  • 水豚 3.31
  • 硒网络驱动程序 3.142.7
  • database_cleaner 1.8

以下规范由于401 Unauthorized响应而失败,再次呈现登录表单,并显示一条错误消息,指出凭据错误。

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,我可以看到密码已正确提交,并且在登录尝试发生之前正在创建用户,但身份验证失败。进入交互式调试会话并尝试在水豚的启动浏览器中手动登录,登录也会失败。但是,通过控制台创建同一用户时,电子邮件/密码登录在开发模式下工作。目前,没有使用其他可能影响登录行为的设计功能(如confirmable(。

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

禁用事务性夹具:我的rails_helper.rb已经包含此内容;

RSpec.configure do |config|
config.use_transactional_fixtures = false
end

配置数据库清理器:这是在无法使用水豚测试设计中建议的,在我开始实施水豚规范之前也已经如此;

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 启动。因此,您不需要数据库清理器,并且应该使用事务测试来获得速度和隔离优势。首先从项目中删除对数据库清理程序的所有引用,然后重新启用事务夹具(默认值(。如果这不能解决您的问题,那么还有其他一些潜在问题。

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

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

如果这些都无济于事,请在您的问题中添加测试的相关部分.log

注意:您编写测试的方式比它们需要的更冗长。如果按 id 查找要fill_in的字段,您只需将 id 传递给fill_in,而不需要对每个元素使用单独的find调用,当您尝试单击的元素符合按钮条件时,您还应该使用语义更click_button

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'

最新更新