Rails 4 - assert_select不使用javascript更新的元素

时间:2013-10-11 05:53:47

标签: javascript ruby-on-rails ruby-on-rails-4 integration-testing

我有一个默认为空白的span元素,并在javascript加载页面时更新。这很好用 - 但是assert_select似乎只能获得初始HTML - 在页面加载完成之前。这是预期的行为吗?我做错了什么?

支架中的span元素生成_form.html.erb:

...
<span id="confirm_loaded"></span>
...

----在app / assets / javascripts中的.js文件中:

$(function(){
  $("#confirm_loaded").html("test");
});

----当我加载页面时 - 页面通过javascript更新,一切都很好。

然而,在集成测试中 - 这一行:

assert_select "span#confirm_loaded", {text: "test"}

因错误而失败:

<test> expected but was
<>..
Expected 0 to be >= 1.

似乎确认测试没有看到javascript设置更新的HTML元素(也许它在页面完全加载之前运行?)

快速更改页面,删除javascript并对HTML进行硬编码:

...
<span id="confirm_loaded">test</span>
...

现在测试通过(assert_select能够获得值,我们是黄金的)。

assert_select只能获取HTML标签的初始值吗?为什么assert_select 在页面加载时通过javascript更新值?

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

,你在问题中说得对。 assert_select 选择元素并对 @response(@ response.body)对象进行相等测试。这是从服务器返回的实际响应,因此当时没有执行任何javascript代码,因此您获得了带有空文本的span。脚本在您的浏览器中运行。

答案 1 :(得分:1)

稍微考虑一下,可能只是命令行测试从服务器获取响应并提供解析/验证。

这将有两个重要方面:

  1. 脚本&amp;客户端代码不会被执行
  2. 进入现场 - 测试提供浏览器界面等的框架 - 以便呈现客户端代码
  3. 似乎就是这种情况 - 但是 - 如果我遗漏了某些内容,我会将问题保持打开状态。