我希望将 RequireJS 用于我的下一个大型 JS 项目,但是我很难弄清楚如何在无头测试环境中对其进行测试。我对 RequireJS 和测试驱动的编码方法都是新手,所以任何对菜鸟友好的东西都会很棒。
2 回答
您可以使用 r.js从命令行测试 RequireJS 模块,以便在 Node 中运行您的脚本。
然后,您可以使用 Node 模块,如assert,为自己创建一个测试套件。
这是一个过于简单的例子:
scripts/simple.js
:
define({ name: 'Really simple module' });
tests/test_simple.js
:
require({ baseUrl: 'scripts' }, ['assert', 'simple'], function(assert, simple) {
var test = function(callback) {
var msg;
try {
callback();
} catch (e) {
msg = 'Failed: expected "' + e.expected +
'" but got "' + e.actual + '" instead.';
}
if (!msg) {
msg = 'Passed';
}
console.log(msg);
};
// This will pass
test(function() {
assert.equal(simple.name, 'Really simple module');
});
// This will fail
test(function() {
assert.equal(simple.name, 'Foo');
});
});
然后,您可以从项目的顶级目录运行测试:
node path/to/r.js test/test_simple.js
你可能会做得比这更好。assert 模块只是您制作测试套件所需的基本模块。如果您不想自己动手,可以尝试使用CommonJS Test Runner之类的包,但请务必先阅读r.js文档。
好的,这是我的想法。您应该只为您自己的代码编写测试,而不是第三方代码,因此无需测试 RequireJS 作为库是否正常工作。(他们有自己的测试,你应该相信。)
所以你应该能够在你的测试中假设 RequireJS 正在工作。就像你假设parseInt
工作,setTimeout
工作,Math.min
工作一样:那些开发人员有自己的测试,你不需要写更多。
如果它不工作(不太可能),或者如果您使用不正确(更有可能),那么您的测试应该会灾难性地失败:例如,您最终将调用不存在的对象上的方法。
考虑到这一点,您应该对各个 RequireJS 模块进行单元测试。为此,每个测试夹具应该包含在一个模块中,该模块是require
它的被测系统模块,或者测试应该是异步的,并且作为它们的一部分,它们应该require
是被测系统模块。再一次,假设你得到了正确的模块:如果你没有,即如果你滥用 RequireJS,测试将失败。