我正在尝试使用实习生来测试在node.js下运行的dojo应用程序
我的intern.js配置文件类似于:
define({
loader: {
packages: [
{ name: 'elenajs', location: 'lib' },
{ name: 'tests', location: 'tests' }
],
map: {
'elenajs': { dojo: 'node_modules/dojo' },
'tests': { dojo: 'node_modules/dojo' }
}
},
suites: [ 'tests/all' ]});
当我尝试使用node node_modules/intern/client.js config=tests/intern
运行测试时,出现此错误:
Error: node plugin failed to load because environment is not Node.js
。
通常我会用
之类的东西配置dojodojoConfig = {
...
hasCache: {
"host-node": 1, // Ensure we "force" the loader into Node.js mode
"dom": 0 // Ensure that none of the code assumes we have a DOM
},
...
};
我如何用实习生解决这个问题?
答案 0 :(得分:3)
您遇到的问题是由于Dojo中的代码依赖于从Dojo加载程序设置的某些has-rules,但这不会发生,因为Dojo加载程序未在使用中。有几种可能的解决方法:
由于Intern的加载程序设置了一些相同的规则,您可以在其他任何尝试加载intern/node_modules/dojo/has
模块之前加载has.add('dojo-has-api', true)
并运行dojo/has
。这应该导致Dojo使用Intern的加载器中的has.js
实现(并采用它已设置的所有规则,当前包括host-node
)。执行此操作的最佳位置将是Intern配置文件,最终会出现如下情况:
define([ 'intern/dojo/has' ], function (has) {
has.add('dojo-has-api', true);
return {
// your existing Intern configuration object…
};
});
在加载任何调用has('host-node')
的模块之前,请加载dojo/has
和intern/node_modules/dojo/has
并致电dojoHas.add('host-node', internHas('host-node'))
(或者我猜您可以对其进行硬编码:)) 。这需要使用加载程序插件代替suites
数组:
// tests/preload.js
define({
load: function (id, require, callback) {
require([ 'dojo/has' ], function (has) {
has.add('host-node', true);
require(id.split(/\s*,\s*/), callback);
}
}
});
然后您的suites
会更改为suites: [ 'tests/preload!tests/all,tests/foo,tests/bar' ]
。
Dojo加载程序依赖的任何其他具有Dojo加载程序设置的规则都需要自己设置。 Dojo从其他部分添加的任何其他规则都可以正常工作。