Trabalhando em várias extensões do Chrome, criei um sinon-chrome
projeto que permite executar testes de unidade usando mocha
, nodejs
e phantomjs
.
Basicamente, ele cria zombarias sinon de toda chrome.*
API, nas quais você pode colocar qualquer resposta json predefinida.
Em seguida, você carrega seus scripts usando os nós da vm.runInNewContext
página de segundo plano e phantomjs
para renderizar a janela pop-up / opções.
E, finalmente, você afirma que a API do Chrome foi chamada com os argumentos necessários.
Vamos dar um exemplo:
suponha que tenhamos uma extensão simples do chrome que exibe o número de guias abertas no emblema do botão.
página de fundo:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
Para testá-lo, precisamos:
- mock
chrome.tabs.query
para retornar uma resposta predefinida, por exemplo, duas guias.
- injetar nossa
chrome.*
API ridicularizada em algum ambiente
- execute nosso código de extensão neste ambiente
- afirmar que o emblema do botão é igual a '2'
O trecho de código é o seguinte:
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"
});
Agora podemos envolvê-lo nas describe..it
funções do mocha e executar no terminal:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
Você pode encontrar um exemplo completo aqui .
Além disso, o sinon-chrome permite acionar qualquer evento chrome com resposta predefinida, por exemplo
chrome.tab.onCreated.trigger({url: 'http://google.com'});