En travaillant sur plusieurs extensions chrome, j'ai créé un sinon-chrome
projet qui permet d'exécuter des tests unitaires en utilisant mocha
, nodejs
et phantomjs
.
Fondamentalement, il crée sinon des simulations de toutes les chrome.*
API où vous pouvez placer toutes les réponses json prédéfinies.
Ensuite, vous chargez vos scripts en utilisant les nœuds vm.runInNewContext
pour la page d'arrière-plan et phantomjs
pour la page contextuelle / d'options de rendu.
Et enfin, vous affirmez que l'API chrome a été appelée avec les arguments nécessaires.
Prenons un exemple:
supposons que nous ayons une simple extension chrome qui affiche le nombre d'onglets ouverts dans le badge de bouton.
page de fond:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
Pour le tester, nous avons besoin de:
- mock
chrome.tabs.query
pour renvoyer une réponse prédéfinie, par exemple deux onglets.
- injecter notre
chrome.*
API fictive dans un environnement
- exécutez notre code d'extension dans cet environnement
- affirmer que le badge du bouton équivaut à «2»
L'extrait de code est le suivant:
const vm = require('vm');
const fs = require('fs');
const chrome = require('sinon-chrome');
// 1. mock `chrome.tabs.query` to return predefined response
chrome.tabs.query.yields([
{id: 1, title: 'Tab 1'},
{id: 2, title: 'Tab 2'}
]);
// 2. inject our mocked chrome.* api into some environment
const context = {
chrome: chrome
};
// 3. run our extension code in this environment
const code = fs.readFileSync('src/background.js');
vm.runInNewContext(code, context);
// 4. assert that button badge equals to '2'
sinon.assert.calledOnce(chrome.browserAction.setBadgeText);
sinon.assert.calledWithMatch(chrome.browserAction.setBadgeText, {
text: "2"
});
Maintenant, nous pouvons l'envelopper dans les describe..it
fonctions de mocha et l'exécuter à partir du terminal:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
Vous pouvez trouver un exemple complet ici .
De plus, sinon-chrome permet de déclencher n'importe quel événement chrome avec une réponse prédéfinie, par exemple
chrome.tab.onCreated.trigger({url: 'http://google.com'});