Працюючи над декількома хромованими розширеннями, я придумав sinon-chrome
проект, який дозволяє запускати одиничні тести за допомогою mocha
, nodejs
та phantomjs
.
В основному, це створює синонімічні макети з усіх chrome.*
API, де ви можете розмістити будь-які заздалегідь задані відповіді json.
Далі ви завантажуєте свої сценарії за допомогою вузла vm.runInNewContext
для фонової сторінки та phantomjs
для сторінки спливаючих вікон / параметрів візуалізації.
І нарешті, ви стверджуєте, що хромовану апі викликали потрібними аргументами.
Візьмемо приклад.
Припустимо, у нас є просте розширення з хромом, яке відображає кількість відкритих вкладок у значку кнопок.
фонова сторінка:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
Для його тестування нам потрібно:
- макет
chrome.tabs.query
для повернення попередньо визначеної відповіді, наприклад, дві вкладки.
- ввести наші знущаються
chrome.*
api в якесь середовище
- запустіть наш код розширення в цьому середовищі
- стверджують, що значок кнопки дорівнює "2"
Фрагмент коду такий:
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"
});
Тепер ми можемо перетворити його на describe..it
функції mocha і запустити з терміналу:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
Ви можете знайти повний приклад тут .
Крім того, син-хром дозволяє викликати будь-яку хромову подію із заздалегідь заданою реакцією, наприклад
chrome.tab.onCreated.trigger({url: 'http://google.com'});