【发布时间】:2021-05-25 15:25:44
【问题描述】:
我正在开发一个使用jQuery 的Deferreds 的节点模块,但无法找出测试它的最佳方法。
文件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();
});
我想简单地执行如下测试:node test/MyModuleTest.js。
代码最终会通过 Browserify 传递给 shim the require('jquery') so it uses the global jQuery object。我的问题是如何让来自MyModule.js 的require('jquery') 调用在测试中工作?
目前运行测试代码报错:
TypeError: $.Deferred is not a function
这是因为require('jquery') 需要一个窗口对象来实际创建 jQuery 对象。否则,返回一个空对象。
我知道我可以使用以下方法使require('jquery')在测试中工作:
var myWindow = require('jsdom').jsdom().defaultView;
var $ = require('jquery')(myWindow);
这可能是答案的一部分,但它本身并不是答案! MyModule.js 中的代码不应该绕过它的 require('jquery') 调用。测试代码或基础设施应该以某种方式处理这个问题。但是怎么做呢?
【问题讨论】:
标签: javascript jquery node.js testing