0

Ich versuche, Funktionen zu testen, während ich eine Chrome-Erweiterung entwickle. Für mein Test-Framework verwende ich Sinon (zum Spionieren, Mock und Stub), Mocha, Chai und Jsdom (um ein Dom zu erstellen, das meinen Chrome-Erweiterungshintergrund und Popup-Skripte ausführt).Wie spioniert man JavaScript-Funktionen in einem Skript aus, das zu Testzwecken in eine jsdom injiziert wird?

Allerdings kann ich nicht in der Lage sein, die Funktionen im Skript (background.js) auszuspionieren, die ich in die jsdom injiziere.

Das ist, was ich tue:

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

Ich vermute, dass das Problem mit entweder einem falschen Import zu tun hat/export oder dass das in das jsdom injizierte Skript background.js nicht vom Spion umschlossen wird. Ich würde es wirklich schätzen, wenn jemand dieses Problem beleuchten könnte!

+0

Ich vermute, das folgende kann etwas Licht werfen: https://stackoverflow.com/questions/5605961/what-is-the-difference-between-jsdom-env-and-jsdom-jsdom – beaumontwebdev

+0

Bitte [bearbeiten] die Frage am Thema sein: ein [mcve] einbeziehen, das * das Problem dupliziert *. Für Chrome-Erweiterungen oder Firefox-WebExtensions müssen Sie fast immer Ihre * manifest.json * und einige der Hintergrund-, Inhalts- und/oder Popup-Skripte/HTML und häufig Webseiten-HTML/-Skripte einschließen. Fragen, die Debugging-Hilfe suchen ("Warum funktioniert mein Code nicht so, wie ich es möchte?") muss beinhalten: (1) das gewünschte Verhalten, (2) ein spezifisches Problem oder einen Fehler und (3) den kürzesten Code, der notwendig ist, um es * in der Frage selbst zu reproduzieren. * Siehe auch: [Welche Themen kann ich hier fragen? ?] (/ help/on-topic) und [fragen]. – Makyen

Antwort

1

Sie den Hintergrund im Rahmen NodeJS erfordern

bg = require('background.js'); 

und dann in Ihrem Test anwenden Sie einen Spion darauf.

JSDOM erhält jedoch seine eigene Kopie der Datei über fs.readFileSync und führt sie in einer Sandbox aus, die vom NodeJS-Kontext getrennt ist - so dass Sie die Fälschung dort nicht anwenden.

Abgesehen davon, von Ihnen zur Verfügung gestellten Beispiel zu urteilen, die searchTabs Funktion ausgeführt wird bereits beim Laden (oder erfordern), um die background.js - so einen Spion nach die Funktion der Anwendung wurde genannt Sie werden nicht die erwarteten Ergebnisse.

Stattdessen können Sie die Funktion von der eigentlichen Ausführung trennen und Fälschungen in der JSDOM-Sandbox anwenden. Das könnte so aussehen:

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

Wenn Sie nach einer einfachen Möglichkeit suchen, Popups oder Hintergrund in JSDOM basierend auf Ihrem manifest.json zu laden, dann könnte webextensions-jsdom auch interessant sein.

Verwandte Themen