为什么我的(javascript)变化事件没有在我的测试中被触发?

问题描述 投票:2回答:3

我有一个有许多类似文本框的页面,我在所有的文本框上都安装了一个Javascript的变化监听器(虽然我写的是Coffeescript)。

HTML示例。

<td class="team" data-node="64" id="team_64">
  <label for="bracket_teams_attributes_(1)">(1)</label>
  <input id="bracket_teams_attributes_name" 
     name="bracket[teams_attributes][name]" size="30" type="text" value="Team 1">
  <input id="bracket_teams_attributes_id" 
     name="bracket[teams_attributes][id]" type="hidden" value="64">
</td>

Coffeescript中的变更监听器。

nameTeam = (target) ->
  send_put(t) for t in $(target)

send_put = (target) ->
  newName = target.value
  node=$(target).closest('td').data('node')
  $.ajax
    type: 'PUT'
    url: $(target).closest('form').attr('action')
    data:
      'team[name]': newName
      'bracket[node]': node

$ ->
  $('input#bracket_teams_attributes_name').on 'change', (e) => nameTeam e.target

忽略性能方面的问题,如果我只是使用这个应用程序,它的工作原理是这样的--无论我如何改变一个文本字段,改变事件都会被触发,数据库也会被更新。

由于我正在努力学习如何测试Javascript,我希望能够在我的测试中编写代码来触发这个变化事件。为此,我有以下一点CapybaraJavascriptjQuery。

within(NODE_64_CSS) do
    fill_and_click_script =
       %Q(
         $('#{NODE_64_CSS} #{INPUT_TEAM_CSS}').focus().val('#{new_name}');
         $('#{NODE_64_CSS} #{INPUT_TEAM_CSS}').focus().trigger('change');
       )
    page.driver.execute_script(fill_and_click_script)
end

其中的常量有适当的值(它们在测试中的其他地方被用来检查最初加载的页面是否正确)。

我花了很多时间在StackOverflow和博客上搜索,试图了解是什么阻碍了我的测试触发变化监听器,并尝试用Webkit和其他各种方法来改变表单值触发变化事件,但都无济于事。如果我使用Webkit和某个版本的 发送键当我启动时,我看不到页面上的变化。send_and_open_page但使用Selenium-Webdriver的我 看到新的文本被输入。然而,页面中的变更监听器并没有被启动,数据库也没有发生变化。

由于我是这个堆栈的新手,我希望我做了一些明显的错误,但我不知道在这一点上应该从哪里寻找。

我的gem环境包含。

 cucumber (1.3.11)
     ~/.rvm/gems/ruby-2.0.0-p451/gems/cucumber-1.3.11
 rails (3.2.13)
     ~/.rvm/gems/ruby-2.0.0-p451/gems/rails-3.2.13
 cucumber-rails (1.4.0)
     ~/.rvm/gems/ruby-2.0.0-p451/gems/cucumber-rails-1.4.0
 selenium-webdriver (2.42.0)
     ~/.rvm/gems/ruby-2.0.0-p451/gems/selenium-webdriver-2.42.0
 capybara (2.2.1)
     ~/.rvm/gems/ruby-2.0.0-p451/gems/capybara-2.2.1
 rspec-rails (2.14.1)
     ~/.rvm/gems/ruby-2.0.0-p451/gems/rspec-rails-2.14.1
 capybara-screenshot (0.3.19)
     ~/.rvm/gems/ruby-2.0.0-p451/gems/capybara-screenshot-0.3.19

如果你觉得需要更多的信息来解决这个问题,我很乐意提供给你。

更新一下。

我现在也试着使用Culerity作为我的Javascript集成测试工具,(毫不奇怪,因为它不再被维护,它的部分基础设施也不再被维护)我到达了一个点,Celerity中存在一个错误,导致NoMethodError--'url'对于我的Cabybara:Server实例在capybara-celerity gem中没有定义。

ruby-on-rails-3.2 selenium-webdriver capybara
3个回答
1
投票

你的代码看起来应该可以用。你可以尝试一下。添加一个 sleep 5 在您输入文本到字段后,在您的测试中调用AJAX调用,以给AJAX调用完成的时间。这应该由Capybara来处理,但也许那里有什么问题。

另外,你能不能在你的测试中添加一些 console.log 左右的语句,以确保问题是变化处理程序没有被启动,而不是AJAX调用的问题。


1
投票

很显然,我不清楚这到底是怎么回事,我的问题源于使用预编译的资产。这很奇怪,因为我的开发环境和测试环境的功能是一样的,而且开发版的工作非常好。

无论如何,我现在至少可以让测试启动变更监听器了。

帮助解决我的问题的SO帖子是:如何避免预编译的资产在开发模式下被服务?

我是因为Capybara googlegroup上的这个帖子才知道的。https:/groups.google.comforum#!searchinruby-capybaraselenium。$20$20event$20%7Csort:dateruby-capybarau8Tnd6SqD3kLou4jBsJuo8J。


0
投票

我也有同样的问题。我很快就发现整个js文件没有被运行。对我来说,预编译的assets似乎也是问题所在。我以前曾手动预编译过assets,以便在本地生产中运行rails,但与开发环境不同的是,测试环境实际上使用了这些预编译的assets。与开发环境不同,测试环境实际上使用了这些预编译的assets。解决的办法是简单地删除这些资产,因为我不再需要它们了。

我在测试环境中添加了一行 environments/test.rb 以防止今后出现这种情况。

  config.assets.prefix = "/assets_test" # don't use production precompiled assets
© www.soinside.com 2019 - 2024. All rights reserved.