【问题标题】:Struggling to setup Jasmine with RequireJS. Module's relative paths in define break when calling from test framework.努力使用 RequireJS 设置 Jasmine。从测试框架调用时,模块在定义中断中的相对路径。
【发布时间】:2012-09-30 19:59:03
【问题描述】:

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

我找到了this article on unit testing with RequireJS and 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 示例背道而驰。

【问题讨论】:

    标签: javascript jquery requirejs jasmine


    【解决方案1】:

    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'
    

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

    【讨论】:

    • 谢谢。这似乎确实有效。是否可以按目录显式声明路径?我真的不知道它会是什么样子,但在我看来,必须在一个位置明确列出 requireJS 模块使用的所有文件破坏了 requireJS 的优点之一——不必有一个长列表JS src 文件在一个位置。这只是我必须接受的测试吗?
    • 好吧,您也可以将路径定义为整个文件夹,因此如果您的生产环境中的需求指向像define(['js/someLib'], function(someLib) { ... } 这样的文件夹,您可以在需求中设置paths: { 'js': '../js/' } .paths 和一切都应该运行良好。
    猜你喜欢
    • 2014-08-19
    • 2012-03-07
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2017-01-05
    • 2016-01-14
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多