在处理几个 chrome 扩展时,我提出了 sinon-chrome 项目,该项目允许使用 mocha、nodejs 和 phantomjs 运行单元测试。
基本上,它会创建所有chrome.* API 的 sinon 模拟,您可以在其中放置任何预定义的 json 响应。
接下来,您使用节点的 vm.runInNewContext 加载脚本作为背景页面,使用 phantomjs 加载脚本弹出/选项页面。
最后,你断言 chrome api 是用所需的参数调用的。
举个例子:
假设我们有一个简单的 chrome 扩展,可以在按钮徽章中显示打开的标签页数。
背景页面:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
为了测试它,我们需要:
- 模拟
chrome.tabs.query 以返回预定义的响应,例如两个标签。
- 将我们模拟的
chrome.* api 注入到某个环境中
- 在这个环境中运行我们的扩展代码
- 断言按钮标记等于“2”
sn-p 代码如下:
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"
});
现在我们可以将它包装到 mocha 的 describe..it 函数中并从终端运行:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
你可以找到完整的例子here。
此外,sinon-chrome 允许触发任何具有预定义响应的 chrome 事件,例如
chrome.tab.onCreated.trigger({url: 'http://google.com'});