未在集成测试中加载Javascript库

时间:2017-04-03 23:50:43

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

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

public static String getValue(String target)
{
    File file = new File("data.txt");

    try
    {
        reader = new Scanner(file);
    } catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }

    String data = null;
    StringBuilder sb = new StringBuilder();

    while (reader.hasNextLine())
    {
        sb.append(reader.nextLine()); 
    }

    data = sb.toString().replaceAll("\\s+", "").trim().toLowerCase();

    String value = null;

    if (data.contains(target))
    {
        //stuck here
    }

    return value;
}

以下是测试中访问过的视图中使用的javascript:

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

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

水豚::鬼驱:: JavascriptError:    在页面上的Javascript代码中引发了一个或多个错误。如果您不关心这些错误,可以通过在Poltergeist配置中设置js_errors:false来忽略它们(详见文档)。

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

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

由于此实验未加载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> 添加到我的布局标题中,此错误消失了。但是,会出现一个新错误,指出未定义<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>变量(它来自另一个库,ace)。

最初,ace-editor引用了我的所有javascript库。所以我不需要在标题中加载它。

我也用application.js进行了测试,同样的情况发生了。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

# 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