Jasmine:无法加载夹具

Jasmine : Fixture could not be loaded

所以我想进入测试驱动开发并决定在我的项目中使用Jasmine

问题是,我无法加载灯具

通常提出的 2 种解决方案是

  1. 运行 chrome 与 --allow-file-access-from-files
  2. 从您的本地服务器提供文件

所以我用了第一个方案,但是没有结果。

然后我设置了我的网络服务器的路由,这样 localhost/fixture/my_fixture 就会 return my_fixture.html.[=14= 的内容]

所以当我手动访问localhost/fixture/my_fixture时,灯具的内容显示在屏幕上。但是在我的 jasmine 规范文件中,当我使用 :

jasmine.getFixtures().fixturesPath = 'http://localhost/fixture'
loadFixtures('quizz_fixture')

我收到以下错误 :

Error: Fixture could not be loaded: http://localhost/fixture/quizz_fixture
(status: error, message: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'http://localhost/fixture/quizz_fixture?_=1455854875950'.)

当我使用错误中给出的 URL 时,我的浏览器显示了 fixture 的内容而没有错误。

因此,我不明白这个错误的原因。有没有人有见识?

编辑:

编辑 2

问题来自 jasmine-jquery,在下面的第 139 行,其中调用了 fail 函数。我无法弄清楚发生了什么,因为据称无法加载的 URL 实际上在我的浏览器中加载得很好:

jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function (relativeUrl) {
    var self = this
      , url = this.makeFixtureUrl_(relativeUrl)
      , htmlText = ''
      , request = $.ajax({
        async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
        cache: false,
        url: url,
        dataType: 'html',
        success: function (data, status, $xhr) {
          htmlText = $xhr.responseText
        }
      }).fail(function ($xhr, status, err) {
          throw new Error('Fixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + err.message + ')')
      })

结果是:

Failed to load 'http://localhost/fixture/quizz_fixture.html?_=1456886216017'

在浏览器中调用时有效。我只是不明白。

谢谢。

如果不至少了解一点服务器的性质或夹具的外观,就很难回答。服务器只是像 node-http-server 这样的简单文件服务器,还是指向您的应用程序?它是否正确地服务于夹具?你的夹具有错误吗?我不能从这里说出任何这些。

不过我要说的是,如果您刚刚开始 TDD,您应该完全避免固定装置。对于刚接触 TDD 的人来说,最大的挑战之一是编写足够小的测试,而 Jasmine fixture 使得编写真正大的测试变得容易。

相反,我建议手动将您需要的最低限度的 DOM 添加到页面,并在 after 挂钩中将其删除。 jasmine-fixture 是一个基本上可以做到这一点的工具。这将迫使您考虑编写测试实际需要多少 DOM,并使您所做的 DOM 更改在测试本身中可见。

所以我找到了一个非常不令人满意的解决方案,但仍然是一个解决方案。

总结

  1. 使用 chrome,我尝试从本地文件加载 jasmine fixture,这不适用于 chrome(这是已知的,出于安全原因禁用) .

  2. 我尝试使用 chrome 标志 --allow-file-access-from-files 但它没有用。所以我放弃了使用本地文件中的夹具。

  3. 我知道 fixture 文件必须从我的网络服务器提供,我也这样做了。但它也没有用,因为一些 Ajax 与固定装置缓存相关的错误。我尝试更新我的 jquery 版本(有点旧),但没有用。最后,我没能理解问题出在哪里。

  4. 我下载了 firefox 并尝试使用上面点 3 的配置执行 jasmine specRunner(网络服务器提供的固定装置),但同样,它没有工作。

  5. 使用firefox,我恢复到点1中的方法,即使用本地fixture文件, 它确实有效。我讨厌那个解决方案,但我需要继续前进,这样就可以了。

结论

如果遇到此类问题,请节省一些时间并使用允许使用本地固件文件的 firefox。

在命令行中你可以这样写:

start chrome --allow-file-access-from-files "path_to_test/SpecRunner.html"

这对我来说已经解决了...希望可以帮助更多人。