Lavorando su diverse estensioni di Chrome ho ideato un sinon-chrome
progetto che consente di eseguire unit test usando mocha
, nodejs
e phantomjs
.
Fondamentalmente, crea simulazioni sinon di tutte le chrome.*
API in cui è possibile inserire qualsiasi risposta json predefinita.
Successivamente, carichi gli script usando il nodo vm.runInNewContext
per la pagina di sfondo e phantomjs
per la pagina popup / opzioni di rendering.
E infine, affermi che Chrome API è stato chiamato con gli argomenti necessari.
Facciamo un esempio:
supponiamo di avere una semplice estensione di Chrome che mostra il numero di schede aperte nel badge del pulsante.
pagina di sfondo:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
Per provarlo abbiamo bisogno di:
- finto
chrome.tabs.query
per restituire una risposta predefinita, ad esempio due schede.
- iniettare la nostra
chrome.*
api derisa in un ambiente
- esegui il nostro codice di estensione in questo ambiente
- asserire che il badge pulsante è uguale a "2"
Lo snippet di codice è il seguente:
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"
});
Ora possiamo avvolgerlo nelle describe..it
funzioni di moka ed eseguire dal terminale:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
Puoi trovare l'esempio completo qui .
Inoltre, sinon-chrome consente di attivare qualsiasi evento chrome con risposta predefinita, ad es
chrome.tab.onCreated.trigger({url: 'http://google.com'});