Trabajando en varias extensiones de Chrome, se me ocurrió un sinon-chrome
proyecto que permite ejecutar pruebas unitarias usando mocha
, nodejs
y phantomjs
.
Básicamente, crea simulacros de sinon de todas las chrome.*
API donde puede colocar cualquier respuesta json predefinida.
Luego, carga sus scripts usando los nodos vm.runInNewContext
para la página de fondo y phantomjs
para la página emergente / opciones de renderizado.
Y finalmente, usted afirma que la API de Chrome se llamó con los argumentos necesarios.
Tomemos un ejemplo:
supongamos que tenemos una extensión simple de Chrome que muestra el número de pestañas abiertas en la insignia del botón.
página de fondo:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
Para probarlo necesitamos:
- simulacro
chrome.tabs.query
para devolver una respuesta predefinida, por ejemplo, dos pestañas.
- inyectar nuestra
chrome.*
api burlada en algún entorno
- ejecuta nuestro código de extensión en este entorno
- afirmar que la insignia del botón es igual a '2'
El fragmento de código es el siguiente:
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"
});
Ahora podemos envolverlo en las describe..it
funciones de mocha y ejecutarlo desde la terminal:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
Puedes encontrar el ejemplo completo aquí .
Además, sinon-chrome permite activar cualquier evento de chrome con una respuesta predefinida, p. Ej.
chrome.tab.onCreated.trigger({url: 'http://google.com'});