0

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

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

黄瓜新用户测试:

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>

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

提前致谢

4

2 回答 2

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 tag 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     |

希望这可以帮助

于 2013-10-25T17:55:22.437 回答
0

所以我确实找到了这个问题,我对最后一个半小时因为我认为是问题而输掉的比赛感到不高兴......

我正在为 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     |

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

那好吧...

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

于 2013-10-25T18:28:56.357 回答