कई क्रोम एक्सटेंशन पर काम करते हुए मैं sinon-chrome
प्रोजेक्ट के साथ आया, जो यूनिट-टेस्ट का उपयोग करने की अनुमति देता है mocha
, nodejs
और phantomjs
।
मूल रूप से, यह सभी chrome.*
एपीआई के साइनॉन मोक्स बनाता है जहां आप किसी भी पूर्वनिर्धारित जसन प्रतिक्रियाओं को डाल सकते हैं।
अगला, आप अपनी स्क्रिप्ट को नोड के 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
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
आप यहां पूरा उदाहरण पा सकते हैं ।
इसके अतिरिक्त, सिनोन-क्रोम किसी भी क्रोम घटना को पूर्वनिर्धारित प्रतिक्रिया के साथ ट्रिगर करने की अनुमति देता है, उदा
chrome.tab.onCreated.trigger({url: 'http://google.com'});