2

我有一个项目,我最近刚刚介绍了 RequireJS。在 RequireJS 之前,我一直在用 Jasmine 测试我的项目。我现在正在尝试更新 Jasmine 的 SpecRunner 以便它可以处理 RequireJS。

我发现这篇关于使用 RequireJS 和 Jasmine 进行单元测试的文章是我用来入门的。我遇到了如何加载模块的问题。每个模块都定义了它所依赖的其他模块,但每个模块的加载路径都与加载 requireJS 的位置相关。

我在两个不同的位置加载 requireJS:background.html 和 SpecRunner.html。背景用于主应用程序,SpecRunner 用于测试。问题是我的模块在从 SpecRunner 调用时无法加载,因为它们的相对路径发生了变化。

例子:

有了这个文件夹层次结构和文件,我有两种情况。一种代码运行正常,另一种存在问题:

好情景

  • background.html 加载 require.js 并以 player.js 作为加载点执行。
  • player.js 将 playlists.js 定义为依赖项。
  • playlists.js 已加载。
  • player.js 已加载。

糟糕的场景

  • SpecRunner.html 加载 require.js 并以 player.js 作为加载点执行。
  • player.js 将 playlists.js 定义为依赖项。
  • playlists.js 无法加载。获取文件://tests/playlists.js
    • 文件位置不正确。playlists.js 不在 /tests 下,它在 js/background 下!

我不确定我应该如何处理这个?似乎对路径名非常明确是我唯一的出路,但这与所有 requireJS 示例背道而驰。

4

1 回答 1

4

require 中的路径是相对于数据主位置或相对于调用的函数的位置require()。在你的好情况下是这样js/background/,在你的坏情况下是这样tests/。在您链接的博客中,他们使用 require.paths 使其正常工作:

<!--
    Since we are in the "test" directory, not in the standard
    "js" directory, we need to define the path prefix' for the
    RequireJS modules so that the modules can be found from the
    tests running in the Spec directory.
-->
<script type="text/javascript">

    var require = {
        paths: {
            "domReady": "../js/lib/require/domReady",
            "model": "../js/model"
        }
    };

</script>

在您的情况下,您必须设置如下路径

'player':    '../js/background/player.js',
'playlists': '../js/background/playlists.js'

并在测试运行程序中明确要求播放器和您的规范,就像他们在博客文章中所做的那样。

于 2012-09-30T21:01:12.997 回答