web-dev-qa-db-ja.com

'import' jsファイルを使用したJavaScriptテスト(mocha)

_module.export_とrequireの方法を理解しています:

モカテストに外部jsファイルが必要

モジュールであればかなり使い勝手がいいのですが、ファイル内のコードをテストするつもりなので、この方法は不便だと思います。

たとえば、ファイルに次のコードがあります。

app.js

_'use strict';
console.log('app.js is running');
var INFINITY = 'INFINITY';
_

そして今、私はこのコードをファイルでテストしたいと思います:

test.js

_var expect = require('chai').expect;

require('./app.js');


    describe('INFINITY', function()
    {
        it('INFINITY === "INFINITY"',
            function()
            {
                expect(INFINITY)
                    .to.equal('INFINITY');
            });
    });
_

テストコードは_app.js_を実行するため、出力は次のようになります。

_app.js is running_

その後

_ReferenceError: INFINITY is not defined_

これは私が期待したものではありません。

_module.export_を使用したくない

var app = require('./app.js');

そして

テストコードのすべての行に対して_app.INFINITY_および_app.anyOtherValue_。

賢い方法が必要です。教えてくださいますか?

ありがとう。

13
user1028880

更新:最終回答:

eval(code);は変数には役立たないため、以前の回答は無効です。

幸い、nodeには強力な方法があります-vm

http://nodejs.org/api/vm.html

ただし、ドキュメントによると、

vmモジュールには多くの既知の問題とエッジケースがあります。問題や予期しない動作が発生した場合は、GitHubの未解決の問題を参照してください。最大の問題のいくつかを以下に説明します。

したがって、これは表面的には機能しますが、テストなどの目的には特別な注意が必要です...

var expect = require('chai')
    .expect;

var fs = require('fs');
var vm = require('vm');
var path = './app.js';

var code = fs.readFileSync(path);
vm.runInThisContext(code);

describe('SpaceTime', function()
{
    describe('brabra', function()
    {
        it('MEMORY === "MEMORY"',
            function()
            {
                expect(MEMORY)
                    .to.equal('MEMORY');
            })
    });

});

すべての後;この場合に私が見つけた最善の方法は、同じファイルにテストモカコードを書くことです。

15
user1028880

私は通常、すべての「プライベート」内部変数と関数への参照を含む_testオブジェクトを含め、エクスポート時に公開します。あなたの場合:

./ app.js

var INFINITY = 'infinity';

function foo() {
    return 'bar';
}

exports._test = {
    INFINITY: INFINITY,
    foo: foo
}

./ test/app-test.js

var app = require('../app.js')
/* ... */
it('should equal bar', function() {
    expect(app._test.foo()).to.equal('bar');
});
it('should equal infinity', function() {
    expect(app._test.INFINITY).to.equal('infinity');
});
5
JayQuerie.com