कई क्रोम एक्सटेंशन पर काम करते हुए मैं 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'});