【问题标题】:Javascript libraries not loaded in integration testsJavascript 库未在集成测试中加载
【发布时间】:2017-04-03 23:50:43
【问题描述】:

我使用 RSpec、Capybara 和 Poltergeist 驱动程序实现了我的集成测试。这是一个例子:

describe "Answer a question", type: :feature, js: true do
  subject(:visit_page) do
    login_as create(:user)

    exercise = create(:exercise)
    question = create_a_question_to_exercise(exercise)
    create(:test_case, :hello_world, question: question)

    visit new_answer_path(question)
  end

  it "shows the answer" do
    visit_page
    content = "puts 'Hello, world!'"
    fill_in_editor_field content
    expect(page).to have_editor_display text: content
  end
end

这是测试中访问的视图中使用的javascript:

<script>
  function adjust_screen() {
    var new_height =  $('.content-wrapper').height()
                      - $('#test-results').height()
                      - $('#error_explanation').height();
    $('.content-wrapper').height(new_height);
    $('#test-results').empty();
    $('#error_explanation').remove();
    $('#answer-result').remove();
    $('.submit').append('<i class="fa fa-refresh fa-spin"></i>');
  }

  var textarea = $('#editor');
  textarea.hide();

  var editor = ace.edit("editor_div");
  editor.setTheme("ace/theme/twilight");
  editor.getSession().setMode("ace/mode/pascal");

  // When click put ace editor content in form hidden textarea.
  $('input[name="commit"]').on('click', function() {
    textarea.val(editor.getSession().getValue());
    adjust_screen();
  });
</script>

运行测试,我收到以下错误:

Capybara::Poltergeist::JavascriptError: 页面上的 Javascript 代码中出现一个或多个错误。如果您不关心这些错误,可以通过在 Poltergeist 配置中设置 js_errors: false 来忽略它们(详情请参阅文档)。

SyntaxError: 解析错误 SyntaxError:解析错误 ReferenceError:找不到变量:$ ReferenceError:找不到变量:$

(在所有涉及 javascript 的测试中都会发生这种情况)

由于这个实验没有加载javascript库的结论:我在布局的标题中添加了&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"&gt;&lt;/script&gt;,这个错误就消失了。但是,出现了一个新的错误,指责ace 变量未定义(它来自另一个库,ace-editor)。

最初,我所有的 javascript 库都在 application.js 中引用。所以我不需要在标题中加载它。

我也用capybara-webkit 进行了测试,结果也是如此。

我完全没有想法。有什么建议么?

【问题讨论】:

    标签: javascript ruby-on-rails rspec capybara poltergeist


    【解决方案1】:

    当 JS 在开发模式下工作但在开发模式下似乎根本没有加载时,这通常是因为您的某个 JS 文件中的某个地方出现错误。在开发模式下,每个文件都是单独加载的,这意味着一个错误不会停止其他文件的加载/解析。但是,在测试模式下,rails 资产管道会将 application.js 中引用的所有文件连接到一个文件中。这意味着一个文件中的错误可能会中止对其后连接的任何 JS 的解析。您可以通过在开发模式下的浏览器开发者控制台中查找错误并修复任何显示的错误来检查这一点。

    【讨论】:

    • 我检查了@ThomasWalpole,但没有找到任何东西。
    • 好吧,我没有发现任何检查我的浏览器控制台的东西,但是 Poltergeist gem 有一个非常好的调试器工具,我可以从中看到我测试的浏览器控制台中的消息。我在application.js 中使用了一个javascript 函数,而在这个函数中我使用的是jquery(导致解析和引用错误)。这是:我在将它加载到我的应用程序之前使用了 jquery。删除它解决了我的问题。非常感谢您的提示!
    • apparition gem 有类似的调试器工具吗?我有同样的问题,在开发中的浏览器控制台中没有看到任何错误。
    • @obromios 从技术上讲这是可能的——通常更容易在非无头模式下运行它
    【解决方案2】:

    我曾经在运行功能测试之前预编译资产

    # Don't forget to include this on rails_helper.rb
    Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
    
    
    # spec/support/feature_helper.rb
    RSpec.configure do |config|
      config.before :all do
        ENV['PRECOMPILE_ASSETS'] ||= begin
          case self.class.metadata[:type]
          when :feature, :view
            STDOUT.write "Precompiling assets..."
    
            system "bundle exec rake assets:precompile > /dev/null 2>&1"
    
            STDOUT.puts "\n Done."
            Time.now.to_s
          end
        end
      end
    end
    

    【讨论】:

    • 感谢@heliohead,但没有奏效。资产已编译,但错误仍然存​​在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2018-11-12
    • 2013-03-18
    相关资源
    最近更新 更多