0

我正在和实习生一起磨牙,发现这很难。我已将我的情况简化为interntest具有基本 package.json 和单个模块的单个文件夹,其中包含我的 intern.js 和测试模块。

interntest/
    package.json
    src/
        mymodule/
            test/
                intern.js
                MyTest.js

我的 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 install现在确实获取这些依赖项。

直接的问题是我正在尝试使用的模块nedbnodemailer我原以为我可以像这样在 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_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)

所以在 find 之后nedb/index.js,它现在无法找到该文件中引用的相对路径,require('./lib/datastore').

显然我有一些基本的扭曲。有人可以建议吗?

4

1 回答 1

1

谢谢 Ken,我的 MyTest.js 中似乎需要这个:

define([
    'intern!tdd',
    'intern/dojo/node!nedb',
    'intern/dojo/node!nodemailer',
    'intern/chai!assert',

显然是因为 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/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/Helperor ../Helper(相对于 MyTest.js)。

于 2013-12-15T02:33:55.327 回答