我有一个非常简单的用户支架页面和一些测试。
it 'update' do
visit '/users/new'
fill_in 'user[login]', with: 'login'
fill_in 'user[password]', with: 'password'
click_on 'Create User'
expect do
visit '/users/1/edit'
fill_in 'user_login', with: 'login'
fill_in 'user_password', with: 'password256'
click_on 'Update User'
# p User.all
end.to change { User.find_by(login: 'login').password }
end
有10%的可能性(我也倾向于推测这可能是由于chrome窗口失去焦点),我得到了一个错误:
2) Users user update
Failure/Error:
expect do
visit '/users/1/edit'
fill_in 'user_login', with: 'login'
fill_in 'user_password', with: 'password256'
click_on 'Update User'
# p User.all
end.to change { User.find_by(login: 'login').password }
NoMethodError:
undefined method `password' for nil:NilClass
end.to change { User.find_by(login: 'login').password }
^^^^^^^^^
Capybara
的屏幕截图,p Users.all
的控制台消息
〈活动记录::关系[#〈用户ID:1、登录方式:“loginlogin”,密码:[已过滤],创建时间:“2022年12月24日18:36:57.938067000 + 0000”,更新时间_网址:“2022年12月24日18:36:58.270584000 + 0000”〉]〉
源表单为
<%= form_with(model: user) do |form| %>
<% if user.errors.any? %>
<div style="color: red">
<h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% user.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
<div>
<%= form.label :login, style: "display: block" %>
<%= form.text_field :login %>
</div>
<div>
<%= form.label :password, style: "display: block" %>
<%= form.password_field :password %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>
我已经尝试在每个fill_in命令的上面和下面添加sleep,但是没有效果。
fill_options: { clear: true }
作为填充参数。
1条答案
按热度按时间bsxbgnwa1#
表单内容加倍通常是由chrome驱动程序中的错误引起的。遇到这种情况时,一个解决方法是指定
fill_options: { clear: :backspace }
来填充。另一个可能的问题是,有时您没有让用户被创建。click_on 'Create User'
在单击按钮后立即返回(或link),并且不等待任何点击触发的行为,因此,在调用visit '/users/1/edit'
之后立即调用它可能会取消最初用于创建用户的表单提交。最好的做法是在用户创建之后,在继续访问新的url之前,对页面中可能发生的任何变化都要有所预期。另一件需要注意的事情是,除非这总是第一次运行测试,否则用户不太可能有一个
1
的id,所以像这样的硬编码url不会随着测试套件的增长而真正工作得很好。