【问题标题】:Rails 4 - assert_select not working with element updated by javascriptRails 4 - assert_select 不适用于由 javascript 更新的元素
【发布时间】:2013-10-11 05:53:46
【问题描述】:

我有一个 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 更新的值?

感谢您的帮助。

【问题讨论】:

  • 请注意,为了缩小范围 - 我继续删除了 turbolinks 宝石

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


【解决方案1】:

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

【讨论】:

  • 我认为我们只能在 js 输出中检测到一些东西,例如:assert_equals @item.count, @response.body.scan('item-id').count
  • 响应无论如何都会改变
【解决方案2】:

仔细考虑一下,这可能只是命令行测试从服务器获取响应并将其提供给解析/验证的情况。

这将有两个重要方面:

  1. 不会执行脚本和客户端代码
  2. 进入场景 - 测试提供浏览器界面的框架等 - 以便呈现客户端代码

似乎是这种情况 - 但是 - 我会留下问题以防我遗漏了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2015-11-26
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多