如何在 Rails Capybara JS 测试中解释 html 之前强制加载脚本

How to force scripts to load before interpreting html in Rails Capybara JS tests

在我的文件 dances.html.erb 中,我的测试抱怨:

Failures:

  1) Creating dances creates a new dance with non-javascript data
     Failure/Error: visit '/dances/new'

     Capybara::Poltergeist::JavascriptError:
       One or more errors were raised in the Javascript code on the page. If you don't care about these errors, you can ignore them by setting js_errors: false in your Poltergeist configuration (see documentation for details).

       ReferenceError: Can't find variable: $
       ReferenceError: Can't find variable: $
           at http://127.0.0.1:33842/dances/new:81 in global code

我认为有问题的 html 代码看起来像

<script>

  $( "#choreographer-autocomplete" ).autocomplete({
    source: <%= a_to_safe_str(Choreographer.all.map &:name) %>,
    autoFocus: true,
    minLength: 0
  });
  $( "#start-type-autocomplete" ).autocomplete({
    source: ["improper","Becket","Becket ccw","four face four","square dance","indecent"],
    autoFocus: true,
    minLength: 0
  });
</script>

这里是对“$”的违规调用。 我认为这意味着 JQuery 没有加载? 如果我剪掉它们,那么下一个错误是:

 Failure/Error: JSON.parse self.figures_json

 ActionView::Template::Error:
   784: unexpected token at '{{toJson(figures.arr)}}'

那些把手是 Angular 的东西。 Angular也没有加载吗?

这是我的 Rails application.js:

//= require angular
//= require jquery
//= require bootstrap-sprockets
//= require jquery_ujs
//= require_tree .

//= require jquery-ui/autocomplete
//= require angucomplete-alt

这在现实世界中工作正常,只是在这个测试中不行。

在执行正文 html 之前,我需要做些什么来加载这些 JS 库吗?

由于您是 运行 最新的 PhantomJS,最可能的原因是您的 JS 文件之一有错误。开发环境和测试环境之间的一个很大区别是,在测试环境中 rails 将所有 JS 文件连接在一起。这意味着一个文件中的错误可能会阻止 JS 的其余部分得到处理。在开发模式下,它们都是独立的,因此一个错误不会阻止其他错误的处理。检查您的浏览器控制台日志是否有错误并确保它们已修复。