_module.export
_とrequire
の方法を理解しています:
モジュールであればかなり使い勝手がいいのですが、ファイル内のコードをテストするつもりなので、この方法は不便だと思います。
たとえば、ファイルに次のコードがあります。
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
_。
賢い方法が必要です。教えてくださいますか?
ありがとう。
更新:最終回答:
eval(code);
は変数には役立たないため、以前の回答は無効です。
幸い、node
には強力な方法があります-vm
ただし、ドキュメントによると、
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');
})
});
});
すべての後;この場合に私が見つけた最善の方法は、同じファイルにテストモカコードを書くことです。
私は通常、すべての「プライベート」内部変数と関数への参照を含む_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');
});