【问题标题】:Loading jQuery on Jasmine on Rails 3.1 plugin before source files在源文件之前在 Jasmine on Rails 3.1 插件上加载 jQuery
【发布时间】:2013-04-01 16:42:16
【问题描述】:

我正在为一个 Rails 插件工作 Jasmine,该插件将包含在从 CDN 加载 jQuery 的 Rails 应用程序中。但是,我在插件中运行 Jasmine 测试时遇到了问题。我需要在 app/assets/javascripts 中的源 javascript 文件之前加载 jQuery,但如果我在 jasmine.yml 中包含 jQuery,它不会在源文件之前加载:

jasmine.yml 内容:

src_dir: "app/assets/javascripts"
src_files:
 - "my_rails_plugin_source_includer.js"
spec_dir: spec/javascripts
asset_paths:
- "vendor/assets/javascripts"

my_rails_plugin_source_includer.js 需要我的源 javascripts:

//= require my_jquery_dependent_script.js
//= require my_other_jquery_dependent_script.js

我正在使用

bundle exec jasmine-headless-webkit --color --keep ./spec/javascripts/specs.js

运行我的测试。我收到一条错误消息,例如

ReferenceError: Can't find variable: jQuery
ReferenceError: Can't find variable: jQuery
Test ordering seed: --seed 1629

如果我在 my_rails_plugin_source_includer.js 中明确需要一个 jQuery javascript 文件(例如 jquery-1.9.1-min.js),我的测试就会通过。但是,我不想这样做,因为我想要实际的 Rails 应用程序,而不是这个插件。关于如何在我的源文件之前需要 jQuery 的任何建议?在我的规范或我的助手中要求它不起作用,因为 Jasmine 似乎总是首先加载源文件(这当然是有道理的)。

【问题讨论】:

    标签: javascript jquery ruby-on-rails testing jasmine


    【解决方案1】:

    我能够通过执行以下操作来解决此问题:

    1. 从the official jQuery source 下载 jquery-1.9.1.min.js 并将其存储在我的 spec/javascripts/support/helpers 文件夹中。
    2. 在我的 spec/javascripts/support/fixtures 文件夹(可以是任意文件夹)中创建一个包含以下内容的 source.js 文件:

      //= require ../helpers/jquery-1.9.1.min
      //= require ../../../../app/assets/javascripts/application
      

      其中 app/assets/javascripts/application.js 是我的插件 JavaScript 的清单。

    3. 编辑我的 jasmine.yml 文件以使用以下来源:

      src_dir: "spec/javascripts/support/fixtures"
      src_files:
       - "source.js"
      

    因此,依赖于 jQuery 的源 JavaScript 只为 Jasmine 测试预加载了 jQuery。

    【讨论】:

      【解决方案2】:

      感谢for your answer, Fares,它让我了解了 jasmine 配置文件发生了什么。

      文件包含在jasmine 页面的<head> 标记中的顺序是可预测的。

      首先,我的设置细节:

      rails 4.0.1
      jasmine 1.3.2
      jquery-rails 3.0.4 (which provides jquery-1.10.2)
      


      这是我的 spec/javascripts/support/jasmine.yml。我没有helpers,我不需要css 文件来测试我的特定应用程序,并且我删除了所有cmets。
      src_files:
        - spec/javascripts/lib/jquery-1.10.2.js
        - app/assets/javascripts/tools/dependency-parser.js
      
      spec_dir: spec/javascripts
      spec_files:
        - '**/*[sS]pec.js'
      


      我的 jasmine 页面的 <head> 按顺序包含以下内容:
      jasmine core  <link rel="shortcut icon" type="image/png" href="/__JASMINE_ROOT__/images/jasmine_favicon.png">
                    <link rel="stylesheet" href="/__jasmine__/jasmine.css" type="text/css" media="screen">
                    <script src="/__jasmine__/jasmine.js" type="text/javascript"></script>
                    <script src="/__jasmine__/jasmine-html.js" type="text/javascript"></script>
                    <script src="/__jasmine__/json2.js" type="text/javascript"></script>
      
         src_files  <script src="/spec/javascripts/lib/jquery-1.10.2.js" type="text/javascript"></script>
                    <script src="/app/assets/javascripts/tools/dependency-parser.js" type="text/javascript"></script>
      
      helper_files  <!-- I didn't have anything here -->
      
        spec_files  <script src="/__spec__/dependency-parser_spec.js" type="text/javascript"></script>
      
      jasmine boot  <script src="/__boot__/boot.js" type="text/javascript"></script>
      


      我的应用使用资产管道、jquery-rails gem,以及 app/assets/application.js 中的典型包含:
      //=require jquery
      //=require jquery-ujs
      //=require tree .
      

      因为我使用的是jquery-rails gem,这意味着我实际上没有任何地方可以直接加载 jQuery JavaScript 文件——如果它们来自任何地方,它们应该来自资产管道。由于某种原因,我似乎也无法包含app/assets/javascripts/application.js 文件。事实证明这没问题。我只想测试我的自定义 JavaScript,它依赖于 jQuery。

      所以,我只是下载了我的应用程序使用的 jQuery 版本(1.10.2),并将其放入:

      spec/javascripts/lib/   <= I created this folder
      

      在那之后一切都运行良好,因为我可以按我需要的顺序加载我的.js 文件。这并不完美。我现在手动让我的 jQuery 版本在我的规范中与我使用的 jquery-rails 的任何版本相同,但现在这是一件相当小的事情......虽然它引出了一个问题,“为什么人们要打包javascript 文件到 gem 中?” 没有其他 Web 框架可以做这种古怪的事情。

      我还尝试使用 jasmine 2.0.0.rc5 gem(撰写本文时的当前版本),因为它本应处理此类资产管道问题,但它对我不起作用。

      我还尝试跳到更复杂的东西,例如使用 jasmine-jquery 或 jasminerice gems,但发现它们的两个实现都是我上面所做的更复杂的版本。一旦我了解了配置文件如何在我的特定情况下生成 &lt;head&gt; 标记的内容,这是一个相对简单的修复。

      如果我觉得有必要,我可能会在它发布后转到jasmine 2.0.0(据说它有更好的 Rails 4 支持),但我很确定这个解决方案会很好地工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-19
        • 2011-11-10
        • 2011-12-18
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多