我正在开发一个使用jQuery
的{{1}} s的节点模块,但无法确定测试它的最佳方法。
文件Deferred
如下所示:
src/MyModule.js
var $ = require('jquery');
var MyModule = module.exports = function() {
// constructor
};
// other module methods that use $.Deferred()
中的示例测试代码:
test/MyModuleTest.js
我想简单地执行这样的测试:var test = require('tape');
var MyModule = require('../src/MyModule');
test('promise test', function(t) {
t.plan(1);
var module = new MyModule();
var promise = module.promiseReturningMethod();
promise.done(function() {
t.ok(true);
});
module.resolveThePromise();
});
。
代码最终将通过Browserify传递,shim the require('jquery')
so it uses the global jQuery object。我的问题是如何从node test/MyModuleTest.js
拨打require('jquery')
来进行测试?
目前运行测试代码会出现错误:
MyModule.js
这是因为TypeError: $.Deferred is not a function
需要一个窗口对象来实际创建jQuery对象。否则,返回一个空对象。
我知道我可以使用以下内容让reqyure('jquery')
在测试中 :
require('jquery')
这可能是答案的一部分,但它本身并不是答案! var myWindow = require('jsdom').jsdom().defaultView;
var $ = require('jquery')(myWindow);
中的代码不应该围绕其MyModule.js
来电。测试代码或基础设施应该以某种方式处理这个问题。但是如何?
答案 0 :(得分:2)
您可以使用mock-require包拦截测试文件中的require()调用:
// test.js
var mock = require('mock-require');
var myWindow = require('jsdom').jsdom().defaultView;
var $ = require('jquery')(myWindow);
mock('jquery', $);
mock.reRequire('jquery'); // This will prevent requrie() calls to return the
// originally cached version of jQuery
// When MyModule will require("jquery"), it will get the one which uses jsdom's window
var MyModule = require("./MyModule.js");