【问题标题】:Cucumber capybara fill_in failing黄瓜水豚填充失败
【发布时间】:2013-10-25 17:46:46
【问题描述】:

我一直在构建一个 rails4 应用程序并使用黄瓜和水豚进行测试,但遇到了障碍。我正在为用户创建和用户编辑进行标准测试。

用户创建测试运行没有任何问题,但是在运行编辑用户的测试时,我无法让水豚实际将新值填充到字段中。 new 和 edit 的表单是相同的(我包含两个部分的相同 _form),并且它在 new 但不是 edit 上也能正常工作。

黄瓜新用户测试:

When I fill in a User with:
  | First Name   | Rufus             |
  | Last Name    | Firefly           |
  | Email        | rfirefly@fake.com |
  | Role(S)      | System Admin      |

黄瓜编辑用户测试:

When I fill in a User with:
  | First Name   | Otis              |
  | Last Name    | Driftwood         |
  | Email        | otis@fake.com     |

对应方法:

When /^(?:|I) fill in (?:a|an|the) (.+) with:$/ do |obj, fields|
  attrs = {}
  fields.rows_hash.each do |name, value|
    fill_in(name, with: value) unless name =~ /\((?:R|S)\)$/
    choose(value) if name =~ /\(R\)$/
    select(value) if name =~ /\(S\)$/
  end
end

渲染的html表单:

<form accept-charset="UTF-8" action="/members/1" class="edit_user" id="edit_user_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="_method" type="hidden" value="put" /></div><div class='field'>
<label for="user_first_name">First Name</label>
<input id="user_first_name" name="user[first_name]" type="text" value="Ronald" />
</div>
<div class='field'>
    <label for="user_last_name">Last Name</label>
    <input id="user_last_name" name="user[last_name]" type="text" value="Kornblow" />
</div>
<div class='field'>
    <label for="user_email">Email</label>
    <input id="user_email" name="user[email]" type="email" value="kornblow@fake.com" />
</div>
<div class='field'>
    <label for="user_password">Password</label>
    <input id="user_password" name="user[password]" type="password" />
</div>

... omitted fields (not required) ...

<input name="commit" type="submit" value="Update User" />
</form>

任何人都可以给我的任何帮助或见解,我将不胜感激。

提前致谢

【问题讨论】:

    标签: tdd cucumber ruby-on-rails-4 capybara


    【解决方案1】:

    在您的代码中:

    When /^(?:|I) fill in (?:a|an|the) (.+) with:$/ do |obj, fields|
      attrs = {}
      fields.rows_hash.each do |name, value|
        fill_in(name, with: value) unless name =~ /\((?:R|S)\)$/
        choose(value) if name =~ /\(R\)$/
        select(value) if name =~ /\(S\)$/
      end
    end
    

    在这里,fill_in(name, :value) 方法通常会自动查找 ID 标签 id=name,但在这里您的姓名与呈现的 HTML 表单显示的不完全一致。

    <div class='field'>
        <label for="user_last_name">Last Name</label>
        <input id="user_last_name" name="user[last_name]" type="text" value="Kornblow" />
    </div>
    

    尝试将您的黄瓜测试更改为:

    When I fill in a User with:
      | user_first_name   | Otis              |
      | user_last_name    | Driftwood         |
      | user_email        | otis@fake.com     |
    

    希望对你有帮助

    【讨论】:

    • 感谢您的回答,尽管我已经看到并一直在使用带有标签文本的 fill_in() 方法。据我了解,fill_in() 接受 id、name 属性或相应的标签文本。我确实找到了我的问题的解决方案,而且似乎与此无关......
    【解决方案2】:

    所以我确实找到了问题,但我对过去一个半小时因我认为是问题而失去的时间感到不高兴......

    我正在为水豚使用一个不错的小调试工具来呈现页面并在浏览器中显示它,这并没有像我上面所说的那样显示更新的字段,但是当我运行 click_button() 时,这些值实际上被保存了.

    真正遇到的问题是,Devise 以其无限的智慧将新电子邮件地址保存到 unconfirmed_email 并保留旧电子邮件,直到用户收到电子邮件并确认。有道理,但显然这是我第一次遇到这种情况。

    所以在我的测试中:

    Given a "User" was updated with:
      | Last Name         | Driftwood     |
      | Email             | otis@fake.com |
    

    email 属性确实不是 'otis@fake.com' 并且测试始终是正确的(无论我如何争论)都是正确的。该用户未使用该电子邮件进行更新。将其更改为:

    Given a "User" was updated with:
      | Last Name         | Driftwood         |
      | Email             | kornblow@fake.com |
      | Unconfirmed Email | otis@fake.com     |
    

    解决了这个问题。我仍然很困惑为什么我在渲染页面时没有看到 fill(ed)_in() 值。有点让我找错树了。

    哦,好吧……

    感谢您的帮助,希望这对其他人有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多