3

我在一个 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 似乎总是首先加载源文件(这当然是有道理的)。

4

2 回答 2

3

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

  1. 从官方 jQuery 源下载 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。

于 2013-04-01T18:53:19.893 回答
0

感谢您的回答,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文件来测试我的特定应用程序,并且我删除了所有评论。

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'


我的<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-railsgem,以及典型的包括app/assets/application.js

//=require jquery
//=require jquery-ujs
//=require tree .

因为我使用的是jquery-railsgem,这意味着我实际上没有任何地方可以直接加载 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.rc5gem(撰写本文时的当前版本),因为它应该处理这样的资产管道问题,但它对我不起作用。

我还尝试跳到更复杂的东西,比如使用jasmine-jqueryor jasminericegems,但发现它们的两个实现都是我上面所做的更复杂的版本。一旦我了解了配置文件<head>在我的特定情况下如何生成标签的内容,这是一个相对简单的修复。

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

于 2013-12-15T00:51:28.640 回答