jQuery 在尝试使用 Chai 和 Mocha 测试遗留 jQuery 插件时未定义

jQuery is not defined when trying to test legacy jQuery plugin using Chai & Mocha

我正在尝试为旧 jQuery 插件编写单元测试。我是现代 Javascript 环境中的新人。我已经尝试为使用 browserify 在生产中部署的 React 创建单元测试。

遗留 jQuery 插件文件如下所示

(function($) {
    $.fn.myLegacyPlugin = function() {
        alert('Hello World!');
    };
})(jQuery);

此文件将上传到 S3 并通过 CDN 访问。 jQuery 将包含在普通浏览器 head 标签中。

测试文件如下。

let expect = require('chai').expect;
let path = require('path');
let $ = require('jquery');

require('../src/plugin.js');

describe('plugin', () => {
    it('should return okay', () => {
        expect(true).to.be.true; //TODO
    });
});

问题是当我尝试执行测试时,运行程序显示 jQuery is not defined。在不修改遗留 jQuery 插件的情况下,如何测试插件?

代码在这里https://github.com/petrabarus/js-test-jquery-legacy

您可能需要 jquery 作为“$”并将其作为 "jQuery" 传递给插件。尽管 jquery 应该用两个名称定义,无论如何。 您可以尝试像这样要求 jquery 吗:

let jQuery= require('jquery');

回答2: 实际上,如果您的代码(插件)依赖于 jquery,您的 plugin.js 在加载之前应该需要 jquery..

所以把plugin.js改成

let $ = require('jquery');
// rest of plugin code...

在尝试了几种可能性之后,我可以不使用模块导入,而是使用读取文件并评估脚本内容。

只改

require('../src/plugin.js');

至此

eval(fs.readFileSync(path.join(__dirname, '../src') + '/plugin.js', 'utf8'));

这样我就不用修改遗留文件了。