Birkaç krom uzantı üzerinde çalışarak , ve sinon-chrome
kullanarak birim testleri gerçekleştirmeye izin veren bir proje hazırladım .mocha
nodejs
phantomjs
Temel olarak, chrome.*
önceden tanımlanmış json yanıtları koyabileceğiniz tüm API'ların sinon alaylarını oluşturur .
Daha sonra, komut dosyalarınızı vm.runInNewContext
arka plan sayfası ve phantomjs
açılır pencere / seçenekler sayfası için düğümleri kullanarak yüklersiniz .
Ve son olarak, krom api'nin gerekli argümanlarla çağrıldığını iddia ediyorsunuz.
Bir örnek verelim:
Düğme rozetinde açılan sekmelerin sayısını gösteren basit bir krom uzantımız var.
arka plan sayfası:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
Test etmek için ihtiyacımız var:
chrome.tabs.query
önceden tanımlanmış yanıtı döndürmek için alay eder, örneğin iki sekme.
- bizim alaycı
chrome.*
api bazı çevreye enjekte
- uzantı kodumuzu bu ortamda çalıştır
- Düğme rozetinin "2" ye eşit olduğunu iddia
Kod pasajı aşağıdaki gibidir:
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"
});
Şimdi mocha'nın describe..it
işlevlerine sarıp terminalden çalışabiliriz:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
Tam örneği burada bulabilirsiniz .
Buna ek olarak, sinon-chrome, önceden tanımlanmış bir yanıtla herhangi bir krom etkinliğini tetiklemeye izin verir, örn.
chrome.tab.onCreated.trigger({url: 'http://google.com'});