【问题标题】:jasmine-jquery loadFixtures with Jasmine 2.0 won't work带有 Jasmine 2.0 的 jasmine-jquery loadFixtures 将不起作用
【发布时间】:2014-02-13 19:15:07
【问题描述】:

我花了大约一天的时间来调试这个,我很茫然。 jasmine-jquery 2.0.2 中似乎有些东西不起作用。

我正在从 Jasmine 1.3.1 和 jasmine-jquery 1.5 更新到最新版本。根据我尝试加载固定装置的方式,我遇到了各种失败。在我调整 jasmine-jquery 以向 ajax.fail() 方法提供参数后,我得到“无法加载 Fixture: ./ExposureWorksheetFixture.html (status: parsererror, message: Invalid XML”。

我的另一个效果是,当我调整示例 jasmine 跑步者并进行测试时,它显示“零固定装置,零故障”。当我引用 jasmine-jquery、jquery 1.10.2 并尝试设置固定装置时,就会发生这种情况。如果我删除该操作(但保留参考),则示例有效。

我在尝试加载固定装置时遇到的另一个错误是“(状态:错误,消息:访问受限 URI 被拒绝)”。这似乎发生在它实际尝试加载位于指定位置的文件时。我看到另一个问题指出 jquery 需要一个真正的 Web 服务器来加载文件,并且它不喜欢本地文件路径,但我对这些库的旧版本没有这个问题。这发生在 Firefox 中。我在 IE 8 中得到 TypeError: Object doesn't support this property or method。在 Firefox 中,我得到 Error: Fixture could not be loaded: spec/javascripts/fixtures/fixture.html (status: error, message: A network error occurred.)

这里有一些示例代码...

在 PlayerSpec.js 中:

jasmine.getFixtures().fixturesPath = "./";
...
beforeEach(function() {
  player = new Player();
  song = new Song
loadFixtures("fixture.html");
});

在 SpecRunner.html 中,注意对 jquery 和 jasmine-jquery 的额外引用:

<!DOCTYPE HTML>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Jasmine Spec Runner v2.0.0</title>

  <link rel="shortcut icon" type="image/png" href="lib/jasmine-2.0.0/jasmine_favicon.png">
  <link rel="stylesheet" type="text/css" href="lib/jasmine-2.0.0/jasmine.css">

  <script type="text/javascript" src="lib/jasmine-2.0.0/jasmine.js"></script>
  <script type="text/javascript" src="lib/jasmine-2.0.0/jasmine-html.js"></script>
  <script type="text/javascript" src="lib/jasmine-2.0.0/boot.js"></script>
  <script type="text/javascript" src="lib/jquery-1.10.2.js"></script>
  <script type="text/javascript" src="lib/jasmine-jquery.js"></script>

  <!-- include source files here... -->
  <script type="text/javascript" src="src/Player.js"></script>
  <script type="text/javascript" src="src/Song.js"></script>

  <!-- include spec files here... -->
  <script type="text/javascript" src="spec/SpecHelper.js"></script>
  <script type="text/javascript" src="spec/PlayerSpec.js"></script>

</head>

<body>
</body>
</html>

运行器上的输出(第一次测试 - 所有测试都失败)

Jasmine2.0.0finished in 0.019s

raise exceptions5 specs, 5 failuresSpec List | Failures
Player should be able to play a Song
Error: Fixture could not be loaded: spec/javascripts/fixtures/fixture.html (status: error, message: Access to restricted URI denied) in file:///D:/Temp/jas/lib/jasmine-jquery.js (line 132)
jasmine.Fixtures.prototype.loadFixtureIntoCache_/request<@file:///D:/Temp/jas/lib/jasmine-jquery.js:132 jQuery.Callbacks/fire@file:///D:/Temp/jas/lib/jquery-1.10.2.js:3048 jQuery.Callbacks/self.add@file:///D:/Temp/jas/lib/jquery-1.10.2.js:3094 jasmine.Fixtures.prototype.loadFixtureIntoCache_@file:///D:/Temp/jas/lib/jasmine-jquery.js:131 jasmine.Fixtures.prototype.getFixtureHtml_@file:///D:/Temp/jas/lib/jasmine-jquery.js:115 jasmine.Fixtures.prototype.read@file:///D:/Temp/jas/lib/jasmine-jquery.js:77 jasmine.Fixtures.prototype.load@file:///D:/Temp/jas/lib/jasmine-jquery.js:65 jasmine.Fixtures.prototype.proxyCallTo_@file:///D:/Temp/jas/lib/jasmine-jquery.js:161 window.loadFixtures@file:///D:/Temp/jas/lib/jasmine-jquery.js:763 @file:///D:/Temp/jas/spec/PlayerSpec.js:9 attemptSync@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1510 QueueRunner.prototype.run@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1498 QueueRunner.prototype.execute@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1485 Env/queueRunnerFactory@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:518 Spec.prototype.execute@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:309 Suite.prototype.execute/wrapChildAsAsync/<@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1708 attemptAsync@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1520 QueueRunner.prototype.run@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1496 QueueRunner.prototype.execute@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1485 Env/queueRunnerFactory@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:518 Suite.prototype.execute@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1696 Suite.prototype.execute/wrapChildAsAsync/<@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1708 attemptAsync@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1520 QueueRunner.prototype.run@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1496 QueueRunner.prototype.execute@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1485 Env/queueRunnerFactory@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:518 Suite.prototype.execute@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1696 @file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:541 attemptAsync@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1520 QueueRunner.prototype.run@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1496 QueueRunner.prototype.execute@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:1485 Env/queueRunnerFactory@file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:518 @file:///D:/Temp/jas/lib/jasmine-2.0.0/jasmine.js:548 window.onload@file:///D:/Temp/jas/lib/jasmine-2.0.0/boot.js:170 

编辑 2/13/14 @ 8:32pm EST:我只是尝试只更新 jasmine-jquery,但当我这样做时一切都失败了(Jasmine 1.31)。我在想这个库一定有什么问题:(

【问题讨论】:

    标签: jasmine jasmine-jquery


    【解决方案1】:

    我要感谢 travisjeffery 的回答。虽然这不是我问题的解决方案,但它让我重新尝试不同的事情。我发布的具体示例的答案是我将夹具放在带有规范的文件夹中,而不是带有跑步者的文件夹,并且路径是相对于跑步者定义的。但是,我的真实设置问题仍然存在。因为我终于得到了一个工作样本,所以我开始努力找出我做错了什么。

    主要问题是我的 HTML Fixture,虽然在 jasmine-jquery 1.5 中有效,但在 2.0.2 版中不再有效。我以为我之前已经通过一次删除一个片段来涵盖所有语法可能性,但是当我再次这样做时,我发现删除我的脚本部分会加载夹具。我把它放回去了,但是 inside 是 html 元素,而不是在它之后。我认为这相当于 XML 文档中的两个根元素,因此 BAM! 解析错误。

    另一个问题是我必须将 jasmine-jquery 脚本放在运行器中在加载 boot.js 文件之后,否则我会得到“0 固定装置 0 失败”。在那之后,我不得不更新 Jasmine 语法,现在我又有了一组有效的测试。我希望这对其他人有所帮助。

    【讨论】:

      【解决方案2】:

      我维护 jasmine-jquery。

      jasmine 和 jasmine-jquery 在这里很好,问题是加载夹具的 ajax 请求不符合浏览器的安全策略。 jasmine-jquery 的 README 中有一个部分:https://github.com/velesin/jasmine-jquery/#cross-domain-policy-problems-under-chrome

      【讨论】:

      • 我会尝试一下,对于 Chrome,但根据上述错误,我在 IE8 和 Firefox 27 上也有错误。我希望我做错了什么,你可以帮我看看。如果您需要,我可以提供更多详细信息。
      • 我刚刚在 chrome 中运行它(在验证了夹具位置设置之后)并设置了选项,我得到了 Error: Fixture could not be loaded: ./fixture.html (status: error, message: A network error occurred.)
      • 我想我明白了。我将夹具与规范放在同一个文件夹中,但路径是相对于跑步者的。我得到了这个场景,所以现在我需要回到我失败的更复杂的现实世界项目。谢谢您的帮助。一旦我弄清楚我的升级,我会更新一个确认的答案。
      【解决方案3】:

      谢谢。我将此添加到 spec_helper.js.coffee:

      # rake spec:javascript loads specs relative to the tmp/jasmine/runner.html, need to override:
      jasmine.getFixtures().fixturesPath="../../spec/javascripts/fixtures"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-28
        • 2013-10-14
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 2012-09-01
        相关资源
        最近更新 更多