0

私はインターンで歯を切っていて、かなり難しいと感じています。interntest基本的な package.json と、intern.js とテスト モジュールを含む 1 つのモジュールを含む 1つのフォルダーに状況を簡略化しました。

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これらの依存関係を取得するようになりました。

当面の問題は、使用しようとしているモジュール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_modules/nedb/package.jsonmain: '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')

明らかに、私は基本的なものをひねりました。誰かアドバイスしてもらえますか?

4

1 に答える 1

1

ケンに感謝します。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();
});

mymodule/Helperそのため、ヘルパーは単純にorとして../Helper(MyTest.js に対して)要求できます。

于 2013-12-15T02:33:55.327 に答える