使用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
(下面的源代码)时,这可以正常工作并记录到控制台:
我也有入口点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.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 控制台中。