Javascript 命令行上的实习生找到nodemailer,但不是它所需的模块
我正在和实习生切牙,觉得很难相处。我已经将我的情况简化为一个Javascript 命令行上的实习生找到nodemailer,但不是它所需的模块,javascript,node.js,dojo,require,intern,Javascript,Node.js,Dojo,Require,Intern,我正在和实习生切牙,觉得很难相处。我已经将我的情况简化为一个interntest文件夹,其中包含一个basic package.json和一个模块,其中包含我的intern.js和测试模块 interntest/ package.json src/ mymodule/ test/ intern.js MyTest.js My package.json列出了在此目录中运行节点所
interntest
文件夹,其中包含一个basic package.json和一个模块,其中包含我的intern.js和测试模块
interntest/
package.json
src/
mymodule/
test/
intern.js
MyTest.js
My package.json列出了在此目录中运行节点所需的基本依赖项:
{
"name": "interntest",
"version": "1.0.0",
"dependencies": {
"intern": "1.3.2",
"nedb": "~0.9.3",
"nodemailer": "~0.5.14",
"requirejs": "",
"dojo": "1.9.2"
}
}
npm安装
现在会获取这些依赖项
当前的问题是我试图使用的nedb
和nodemailer
模块。我原以为我可以在intern.js中简单地声明它们,如下所示:
loader: {
// Packages that should be registered with the loader in each testing environment
packages: [
'node',
'nedb',
'nodemailer',
在MyTest.js中需要,只需使用:
define([
'intern!tdd',
'intern/chai!assert',
'nedb',
'nodemailer'
], function (test, assert, Datastore, nodemailer) {
但似乎无法加载nedb
,尽管node\u modules/nedb/package.json
正确指定了main:'index'
neek@alyssa:~/src/interntest$ ./node_modules/.bin/intern-client config=src/mymodule/test/intern suites=mymodule/test/MyTest
Defaulting to "console" reporter
Error: Failed to load module nedb/main from /home/neek/src/interntest/node_modules/nedb/main.js (parent: mymodule/test/MyTest)
at /home/neek/src/interntest/node_modules/intern/node_modules/dojo/dojo.js:742:12
at fs.js:207:20
at Object.oncomplete (fs.js:107:15)
为了避免这个问题,我最终在MyTest.js
中找到了这个:
define([
'intern!tdd',
'intern/chai!assert',
'nedb/index',
'nodemailer/lib/nodemailer'
这似乎是错误的,但至少避免了从这些模块加载任何.js文件的最初失败。然而,这似乎有致命的缺陷:
neek@alyssa:~/src/interntest$ ./node_modules/.bin/intern-client config=src/mymodule/test/intern suites=mymodule/test/MyTest
Defaulting to "console" reporter
Error: Attempt to require unloaded module lib/datastore
at contextRequire (/home/neek/src/interntest/node_modules/intern/node_modules/dojo/dojo.js:255:12)
at req (/home/neek/src/interntest/node_modules/intern/node_modules/dojo/dojo.js:30:10)
at /home/neek/src/interntest/node_modules/nedb/index.js:7:17
at Function.vm.runInThisContext (/home/neek/src/interntest/node_modules/intern/node_modules/istanbul/lib/hook.js:163:16)
at /home/neek/src/interntest/node_modules/intern/node_modules/dojo/dojo.js:745:8
at fs.js:266:14
at Object.oncomplete (fs.js:107:15)
因此,在找到nedb/index.js
之后,它现在无法找到该文件中引用的相对路径,require('./lib/datastore')
很明显我有一些基本的错误。有人能给我一些建议吗?谢谢Ken,看来我在MyTest.js中需要这个:
define([
'intern!tdd',
'intern/dojo/node!nedb',
'intern/dojo/node!nodemailer',
'intern/chai!assert',
define([
'intern!tdd',
'intern/chai!assert',
'intern/dojo/node!nedb',
'intern/dojo/node!nodemailer',
'../Helper'
], function (test, assert, Datastore, nodemailer, Helper) {
console.log('Great, test module was loaded');
Helper.doSomething();
});
显然,因为nedb和nodemailer不是AMD,它们是CommonJS(?),所以必须使用inter/dojo/node代码>插件以在我的AMD上下文中加载它们
这将产生一个工作测试
对于学习这一点的其他人来说,当我自己创建一个非常简单的AMD模块时,它可以作为正常的需要。src/mymodule/Helper.js:
define([], function () {
return {
doSomething: function () {
console.log('Helper did something.');
}
}
});
以及MyTest.js:
define([
'intern!tdd',
'intern/dojo/node!nedb',
'intern/dojo/node!nodemailer',
'intern/chai!assert',
define([
'intern!tdd',
'intern/chai!assert',
'intern/dojo/node!nedb',
'intern/dojo/node!nodemailer',
'../Helper'
], function (test, assert, Datastore, nodemailer, Helper) {
console.log('Great, test module was loaded');
Helper.doSomething();
});
因此,可以简单地将Helper设置为mymodule/Helper
或。/Helper
(相对于MyTest.js)。您是否看到了位于的“测试非AMD代码”部分?