gpt4 book ai didi

javascript - 在 Node 中测试使用 require ('jquery' ) 的 javascript 代码

转载 作者:行者123 更新时间:2023-11-28 20:28:46 30 4
gpt4 key购买 nike

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

文件 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') 调用。测试代码或基础设施应该以某种方式处理这个问题。但是如何呢?

最佳答案

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

关于javascript - 在 Node 中测试使用 require ('jquery' ) 的 javascript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39948306/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com