Bei der Arbeit an mehreren Chrome-Erweiterungen habe ich ein sinon-chrome
Projekt entwickelt, mit dem Unit-Tests mit ausgeführt werden könnenmocha
, nodejs
und phantomjs
.
Grundsätzlich werden sinon-Mocks aller chrome.*
APIs erstellt, in die Sie vordefinierte JSON-Antworten einfügen können.
Als Nächstes laden Sie Ihre Skripte mithilfe von Knoten vm.runInNewContext
für die Hintergrundseite undphantomjs
für die Render-Popup- / Optionsseite.
Und schließlich behaupten Sie, dass Chrome API mit den erforderlichen Argumenten aufgerufen wurde.
Nehmen wir ein Beispiel:
Nehmen wir Angenommen, wir haben eine einfache Chrome-Erweiterung, die die Anzahl der geöffneten Registerkarten im Schaltflächenabzeichen anzeigt.
Hintergrundseite:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
Um es zu testen, brauchen wir:
- spotten
chrome.tabs.query
, um eine vordefinierte Antwort zurückzugeben, z. B. zwei Registerkarten.
- spritzen unsere verspotteten
chrome.*
API in eine Umgebung
- Führen Sie unseren Erweiterungscode in dieser Umgebung aus
- behaupten, dass das Button-Badge gleich '2' ist
Das Code-Snippet lautet wie folgt:
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"
});
Jetzt können wir es in Mokkas describe..it
Funktionen einwickeln und vom Terminal aus ausführen:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
Sie können das vollständige Beispiel finden hier .
Darüber hinaus ermöglicht Sinon-Chrome das Auslösen eines beliebigen Chrome-Ereignisses mit vordefinierter Antwort, z
chrome.tab.onCreated.trigger({url: 'http://google.com'});