3

使用testr.js模拟RequireJS依赖项时,我在启动和运行时遇到了一些麻烦。我有以下目录结构:

<root>
  |-- Scripts
  |    |-- lib
  |    |    +-- require.js
  |    +-- modules
  |         |-- dependency.js
  |         +-- testable-thing.js
  |-- Test
  |    |-- lib
  |    |    +-- testr.js
  |    +-- index.html
  +-- index.html

在这种情况下,被测系统将是testable-thing.js,而我想使用 testr 切换出的依赖项是dependency.js。这里有源代码:

// testable-thing.js
define(["scripts/modules/dependency"], function (dep) {
    console.log("testable thing loaded");
});

// dependency.js
define(function () {
    console.log("dependency loaded");
});

当请求http://<root>/index.html使用require-config.js(下面的源代码)时,这可以正常工作并记录到控制台:

显示需要 js 正确加载内容的图像

我也有入口点http://<root>/test/index.html,它在完整的应用程序中将运行 JavaScript 单元测试。它看起来像这样:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script src="/scripts/lib/require.js"></script>
    <script src="/test/lib/testr.js"></script>
</head>
<body>
    <script>

        testr.config({
            root: "../"
        });

        testr.run("/scripts/require-config.js", function () {
            console.log("entering tests");

            var sut = testr("modules/testable-thing", {
                "modules/dependency": function () {
                    console.log("stub loaded");
                }
            });
        });
    </script>
</body>
</html>

这就是我遇到麻烦的地方。它给出了这个输出:

显示模块绑定与 testr 一起退出的图像

现在,我知道 testr.js 覆盖了 RequireJS 的require方法来注册加载了哪些模块并用传递给testr函数的存根/模拟覆盖它们,但我无法终生锻炼如何“加载”这些依赖项。如果我修改testr.run回调例程test/index.html以包含加载依赖项的内容:

testr.run("/scripts/require-config.js", function () {
    console.log("entering tests");

    require(["modules/testable-thing"], function () { });

    var sut = testr("modules/testable-thing", {
        "modules/dependency": function () {
            console.log("stub loaded");
        }
    });
});

然后会发生这种情况:

显示尝试预先加载模块的图像甚至更奇怪

我真的不确定为什么entering tests在这里打印两次。它只出现在源代码中的那个地方。

这是我<root>/index.html和我的<root>/scripts/require-config.js

// <root>/index.html
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script src="/scripts/lib/require.js" data-main="/scripts/require-config.js"></script>
</head>
<body>
<script>
require(["modules/testable-thing"], function (testableThing) {
});
</script>
</body>
</html>
// <root>/scripts/require-config.js

require.config({
    baseUrl: "/scripts"
});

如何通过模拟这些依赖项来启动和运行?请求时<root>/test/index.html我想查看:

entering tests
stub loaded
testable thing loaded

在 Chrome 控制台中。

4

1 回答 1

1

我有一件事有点不对劲。在http://<root>/tests/index.html

require(["modules/testable-thing"], function () {
    console.log("entering tests");

    var sut = testr("modules/testable-thing", {
        "modules/dependency":  {
            run: function () {
                console.log("stub loaded");
            }
        }
    });
});

请注意测试是如何作为传递给require(). Boilerplatejs 贡献者 Janith 的这篇文章对此很有帮助。

此外,当前版本的 testr 中似乎存在一个错误。使用最新的(1.3.2)我们得到这个输出:

在此处输入图像描述

而使用1.0.2(这是 Boilerplatejs 使用的)我们获得了成功:

在此处输入图像描述

今晚打算再做一些调查,看看这是怎么回事。

于 2013-09-22T21:47:43.460 回答