BIÊN TẬP:
Tải mô-đun bằng cách sử dụng vm
có thể gây ra hành vi không mong muốn (ví dụ: instanceof
toán tử không còn hoạt động với các đối tượng được tạo trong mô-đun đó vì các nguyên mẫu toàn cầu khác với các mô-đun được sử dụng trong mô-đun được tải bình thường require
). Tôi không còn sử dụng các kỹ thuật dưới đây và thay vào đó sử dụng tua lại mô-đun . Nó hoạt động tuyệt vời. Đây là câu trả lời ban đầu của tôi:
Xây dựng câu trả lời của srosh ...
Tôi cảm thấy hơi khó chịu, nhưng tôi đã viết một mô-đun "test_utils.js" đơn giản cho phép bạn làm những gì bạn muốn mà không cần xuất điều kiện trong các mô-đun ứng dụng của bạn:
var Script = require('vm').Script,
fs = require('fs'),
path = require('path'),
mod = require('module');
exports.expose = function(filePath) {
filePath = path.resolve(__dirname, filePath);
var src = fs.readFileSync(filePath, 'utf8');
var context = {
parent: module.parent, paths: module.paths,
console: console, exports: {}};
context.module = context;
context.require = function (file){
return mod.prototype.require.call(context, file);};
(new Script(src)).runInNewContext(context);
return context;};
Có một số điều nữa được bao gồm trong gobal của mô-đun nút module
đối tượng yêu tinh cũng có thể cần phải đi vào context
đối tượng ở trên, nhưng đây là tập hợp tối thiểu mà tôi cần để nó hoạt động.
Đây là một ví dụ sử dụng mocha BDD:
var util = require('./test_utils.js'),
assert = require('assert');
var appModule = util.expose('/path/to/module/modName.js');
describe('appModule', function(){
it('should test notExposed', function(){
assert.equal(6, appModule.notExported(3));
});
});