簡體   English   中英

如何監視為了測試目的而注入到jsdom中的腳本中的javascript函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM