Ruby on rails 用capybara设计登录验收测试
关于stackoverflow已经有了一些问题和可能的解决方案,但似乎没有一个能解决我的问题,因此我要问另一个问题,希望它足够具体,不会重复 我正在尝试测试一个使用Desive的定制登录表单。环境包括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
- 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
)
到目前为止,我发现的大多数问题都有以下几点建议:
禁用事务性装置:Myrails\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很高兴它能起作用,那么使用较少的填充内容
,您到底遇到了什么错误?根本没有填充密码,只有密码字段。