我找到了解决这个问题的三种不同的解决方案,但没有一个是令人愉快的。
内联定义依赖项
define('hurp', [], function () {
return {
beans: 'Beans'
};
});
define('durp', [], function () {
return {
beans: 'durp beans'
};
});
require('hurpdhurp', function () {
// test hurpdurp in here
});
闷闷不乐。你必须用大量的 AMD 样板来打乱你的测试。
从不同路径加载模拟依赖
这涉及使用单独的 config.js 文件为每个指向模拟而不是原始依赖项的依赖项定义路径。这也很丑陋,需要创建大量的测试文件和配置文件。
在节点中伪造它
这是我目前的解决方案,但仍然是一个糟糕的解决方案。
您创建自己的define
函数来为module提供自己的模拟并将您的测试放在回调中。然后你eval
的module来运行你的测试,像这样:
var fs = require('fs')
, hurp = {
beans: 'BEANS'
}
, durp = {
beans: 'durp beans'
}
, hurpDurp = fs.readFileSync('path/to/hurpDurp', 'utf8');
;
function define(deps, cb) {
var TestableHurpDurp = cb(hurp, durp);
// now run tests below on TestableHurpDurp, which is using your
// passed-in mocks as dependencies.
}
// evaluate the AMD module, running your mocked define function and your tests.
eval(hurpDurp);
这是我首选的解决方案。它看起来有点神奇,但它有一些好处。
- 在 node 中运行你的测试,所以不会搞乱浏览器自动化。
- 在您的测试中更少需要凌乱的 AMD 样板。
- 你可以
eval
在愤怒中使用,并想象克罗克福德怒火中烧。
显然,它仍然有一些缺点。
- 由于您在 node 中进行测试,因此您无法对浏览器事件或 DOM 操作进行任何操作。只适合测试逻辑。
- 设置起来还是有点笨拙。您需要
define
在每个测试中模拟,因为这是您的测试实际运行的地方。
我正在开发一个测试运行器,为这类东西提供更好的语法,但我仍然没有解决问题 1 的好方法。
结论
在 requirejs 中模拟 deps 很难。我找到了一种有效的方法,但仍然不太满意。如果您有更好的想法,请告诉我。