ruby 水豚不替换输入的默认值

j2cgzkjk  于 2022-12-26  发布在  Ruby
关注(0)|答案(1)|浏览(120)

我有一个非常简单的用户支架页面和一些测试。

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 }

作为填充参数。

bsxbgnwa

bsxbgnwa1#

表单内容加倍通常是由chrome驱动程序中的错误引起的。遇到这种情况时,一个解决方法是指定fill_options: { clear: :backspace }来填充。另一个可能的问题是,有时您没有让用户被创建。click_on 'Create User'在单击按钮后立即返回(或link),并且不等待任何点击触发的行为,因此,在调用visit '/users/1/edit'之后立即调用它可能会取消最初用于创建用户的表单提交。最好的做法是在用户创建之后,在继续访问新的url之前,对页面中可能发生的任何变化都要有所预期。

...
fill_in 'user[login]', with: 'login', fill_options: { clear: :backspace }
fill_in 'user[password]', with: 'password', fill_options: { clear: :backspace }
click_on 'Create User'
expect(page).to have_text('User created')
expect do
  visit '/users/1/edit'
  fill_in 'user_login', with: 'login'
  ...

另一件需要注意的事情是,除非这总是第一次运行测试,否则用户不太可能有一个1的id,所以像这样的硬编码url不会随着测试套件的增长而真正工作得很好。

相关问题