Bekerja pada beberapa ekstensi chrome saya datang dengan sinon-chrome
proyek yang memungkinkan untuk menjalankan tes unit menggunakan mocha
, nodejs
dan phantomjs
.
Pada dasarnya, ini menciptakan sinon tiruan dari semua chrome.*
API di mana Anda dapat menempatkan respons json yang telah ditentukan.
Selanjutnya, Anda memuat skrip Anda menggunakan simpul vm.runInNewContext
untuk halaman latar belakang dan phantomjs
untuk membuat halaman popup / opsi.
Dan akhirnya, Anda menegaskan bahwa api chrome dipanggil dengan argumen yang diperlukan.
Mari kita ambil contoh:
Asumsikan kita memiliki ekstensi krom sederhana yang menampilkan jumlah tab yang dibuka di lencana tombol.
halaman latar belakang:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
Untuk mengujinya kita perlu:
- tiru
chrome.tabs.query
untuk mengembalikan respons yang telah ditentukan, misalnya dua tab.
- menyuntikkan
chrome.*
api mocked kami ke beberapa lingkungan
- jalankan kode ekstensi kami di lingkungan ini
- menegaskan bahwa lencana tombol sama dengan '2'
Cuplikan kode adalah sebagai berikut:
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"
});
Sekarang kita bisa membungkusnya menjadi describe..it
fungsi moka dan lari dari terminal:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
Anda dapat menemukan contoh lengkapnya di sini .
Selain itu, sinon-chrome memungkinkan untuk memicu acara chrome dengan respons yang telah ditentukan, misalnya
chrome.tab.onCreated.trigger({url: 'http://google.com'});