[英]How to spy on javascript functions in a script that's injected into a jsdom for testing purposes?
我正在嘗試在開發chrome擴展程序時測試功能。 對於我的測試框架,我正在使用sinon(監視,模擬和存根),mocha,chai和jsdom(創建執行chrome擴展程序背景和彈出腳本的dom)。
但是,我似乎無法監視要注入jsdom的腳本(background.js)中的功能。
這就是我在做什么:
background.js
function searchTabs() {...}
searchTabs();
module.exports.searchTabs = searchTabs;
background.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 :(
});
});
我懷疑問題出在不正確的導入/導出,或者是注入到jsdom中的background.js腳本沒有被間諜包裹。 如果有人可以闡明這個問題,我將非常感激!
您需要NodeJS上下文中的背景
bg = require('background.js');
然后在您的測試中對此應用間諜。
但是, fs.readFileSync
通過fs.readFileSync
獲取其自己的文件副本,並在與fs.readFileSync
上下文分離的沙箱中執行該文件-因此,您無需在其中應用偽造的文件。
除此之外,從您提供的示例來看,當您加載(或要求)background.js時已經執行了searchTabs
函數-因此,在調用該函數之后應用間諜將無法獲得預期的結果。
相反,您可以做的是將函數與實際執行分開,並在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可能也會很有趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.