gpt4 book ai didi

javascript - 如何监视出于测试目的而注入(inject) jsdom 的脚本中的 javascript 函数?

转载 作者:行者123 更新时间:2023-12-03 03:27:08 25 4
gpt4 key购买 nike

我正在尝试在开发 Chrome 扩展时测试功能。对于我的测试框架,我使用 sinon(用于监视、模拟和 stub )、mocha、chai 和 jsdom(用于创建执行我的 chrome 扩展背景和弹出脚本的 dom)。

但是,我似乎无法监视我注入(inject) jsdom 的脚本(background.js)中的函数。

这就是我正在做的事情:

背景.js

function searchTabs() {...}

searchTabs();

module.exports.searchTabs = searchTabs;

背景.test.js

var fs = require('fs');
var sinon = require('sinon');
var chrome = require('sinon-chrome');
var assert = require('chai').assert;
var jsdom = require('jsdom');

var bg = require('background.js');

var window;
var spy;

describe('background page', function () {

beforeEach(function () {
jsdom.env({
html: '<html></html>',
src: [
fs.readFileSync('background.js', 'utf-8'), // Inject script into jsdom
],
created: ...,
done: ...,
});
});

afterEach(function () {
chrome.reset();
window.close();
});

it('should call searchTabs', function () {
spy = sinon.spy(bg.searchTabs);

sinon.assert.calledOnce(spy); // This is not called :(
});
});

我怀疑问题与不正确的导入/导出有关,或者注入(inject)到 jsdom 中的 background.js 脚本没有被 spy 包装。如果有人能够阐明这个问题,我将非常感激!

最佳答案

您需要 NodeJS 上下文中的背景

bg = require('background.js');

然后在你的测试中你应用一个 spy 。

然而,JSDOM 通过 fs.readFileSync 获取自己的文件副本,并在与 NodeJS 上下文分离的沙箱中执行它 - 因此您不会在那里应用伪造的文件。

除此之外,从您提供的示例来看,当您加载(或需要)background.js 时,searchTabs 函数已经执行 - 因此在之后应用 spy 被调用的函数不会得到预期的结果。

您可以做的是将函数与实际执行分离,并在 JSDOM 沙箱内应用假值。看起来可能是这样的:

background.js

window.searchTabs = () => {
// I'm searching for tabs
}

run.js

window.searchTabs();

test.js

const fs = require('fs');
const chrome = require('sinon-chrome');
const {JSDOM} = require('jsdom');

const html = '<!DOCTYPE html><html><head></head><body></body></html>';

const dom = new JSDOM(html, {
runScripts: 'outside-only',
beforeParse(window) {
window.chrome = chrome;
}
});

dom.window.eval(fs.readFileSync('background.js'));

const spy = sinon.spy(dom.window, 'searchTabs');

dom.window.eval(fs.readFileSync('run.js'));

sinon.assert.calledOnce(spy);

如果您正在寻找一种简单的方法来根据您的manifest.json 在 JSDOM 中加载弹出窗口或背景,那么 webextensions-jsdom可能也很有趣。

关于javascript - 如何监视出于测试目的而注入(inject) jsdom 的脚本中的 javascript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46271006/

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