【问题标题】:Testing javascript code that uses require('jquery') in node测试在节点中使用 require('jquery') 的 javascript 代码
【发布时间】:2021-05-25 15:25:44
【问题描述】:

我正在开发一个使用jQueryDeferreds 的节点模块,但无法找出测试它的最佳方法。

文件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.jsrequire('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


    【解决方案1】:

    您可以使用 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 require() 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");
    

    【讨论】:

    • 像魅力一样工作!谢谢!
    猜你喜欢
    • 2015-04-12
    • 2013-06-05
    • 2018-10-16
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多