在节点

时间:2016-10-09 20:39:01

标签: javascript jquery node.js testing

我正在开发一个使用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来电。测试代码或基础设施应该以某种方式处理这个问题。但是如何?

1 个答案:

答案 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");