黄瓜水豚fill_in失败

时间:2013-10-25 17:46:47

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

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

用户创建测试没有任何问题,但在运行测试以编辑用户时,我无法让capybara将新值填入字段中。新的和编辑的表单是相同的(我将两个相同的_form包括在内)并且它再次适用于新的但不能编辑。

黄瓜新用户测试:

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>

任何人都可以给予我任何帮助或见解我会非常感激。

提前致谢

2 个答案:

答案 0 :(得分:0)

在您的代码中,您有:

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     |

希望这有帮助

答案 1 :(得分:0)

所以我确实找到了这个问题,而且由于我认为这个问题导致我失去了最后一个半小时我感到不高兴...

我正在使用一个很好的小调试工具for the capybara来渲染页面并在浏览器中显示它并没有像我上面所说的那样显示更新的字段,但是当我运行click_button()时,这些值实际上是保存的

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

所以在我的测试中:

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

电子邮件属性确实不是'otis@fake.com'而且测试,因为它始终是(无论我多么争论)是对的。该用户未使用该电子邮件更新。将此更改为:

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

解决了这个问题。我仍然感到困惑,为什么当我渲染页面时,我没有看到填充(ed)_in()值。有点让我吠叫错误的树。

哦,好吧......

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