0

J'essaye de tester des fonctions tout en développant une extension de chrome. Pour mon framework de test, j'utilise sinon (pour espionner, simuler, et stub), mocha, chai, et jsdom (pour créer un dom qui exécute mon arrière-plan d'extension chromée et des scripts popups). Cependant, je n'arrive pas à espionner les fonctions du script (background.js) que j'injecte dans le jsdom.Comment espionner les fonctions javascript dans un script qui est injecté dans un jsdom à des fins de test?

C'est ce que je fais:

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 :(
    }); 
}); 

Je soupçonne que le problème doit faire avec soit une importation incorrecte/export ou que le script background.js injecté dans le jsdom n'est pas enveloppé par l'espion. J'apprécierais vraiment si quelqu'un peut faire la lumière sur ce problème!

+0

Je soupçonne que ce qui suit peut faire la lumière: https://stackoverflow.com/questions/5605961/what-is-the-difference-between-jsdom-env-and-jsdom-jsdom – beaumontwebdev

+0

S'il vous plaît [modifier] la question être sur le sujet: inclure un [mcve] qui * duplique le problème *. Pour les extensions Chrome ou Firefox WebExtensions, vous devez presque toujours inclure votre * manifest.json * et une partie de l'arrière-plan, du contenu et/ou des scripts contextuels/HTML, et souvent des HTML/scripts de pages Web. Des questions sur l'aide au débogage («Pourquoi mon code ne fonctionne-t-il pas comme je le souhaite?") doit inclure: (1) le comportement désiré, (2) un problème ou une erreur spécifique et (3) le code le plus court nécessaire pour le reproduire * dans la question elle-même * Voir aussi: [Quels sujets puis-je poser ici? ?] (/ help/on-topic), et [demander]. – Makyen

Répondre

1

Vous nécessitant l'arrière-plan dans le contexte NodeJS

bg = require('background.js'); 

puis dans votre test vous appliquez un espion à cela. JSDOM obtient cependant sa propre copie du fichier via fs.readFileSync et l'exécute dans un sandbox, séparé du contexte NodeJS - donc vous n'appliquez pas le faux là-bas.

En outre, à en juger par votre exemple fourni, la fonction searchTabs est déjà exécutée lorsque vous chargez (ou besoin) les background.js - afin d'appliquer un espion après la fonction appelée wont vous se est d'obtenir les résultats escomptés. Ce que vous pouvez faire à la place est de séparer la fonction de l'exécution réelle et d'appliquer des fakes, à l'intérieur du sandbox JSDOM, entre les deux. Cela pourrait ressembler à ceci:

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); 

Si vous cherchez un moyen facile de charger des popups ou un arrière-plan dans JSDOM basé sur votre manifeste.json alors webextensions-jsdom pourrait être intéressant aussi.