有什么好方法可以做到这一点吗?我正在编写一个扩展,它作为内容脚本与网站交互,并使用本地存储保存数据。有没有什么工具、框架等可以用来测试这个行为呢?我知道有一些通用的工具来测试javascript,但是这些工具足够强大来测试一个扩展吗?单元测试是最重要的,但我也对其他类型的测试(如集成测试)感兴趣。
发布于 2010-05-25 02:44:57
是的,现有的框架非常有用。
最近,我将所有的测试放在一个“测试”页面上,该页面嵌入到应用程序中,但除非以物理方式输入,否则无法访问。
例如,我将一个页面中的所有测试都放在
测试将可以访问
为了访问内容脚本,理论上你可以通过测试页面中嵌入的IFRAMEs来测试它,然而这些是更多的集成级测试,单元测试将要求你从实际页面中抽象出来,这样你就不需要依赖它们了,就像访问localStorage一样。
如果您想要直接测试页面,您可以编排您的扩展来打开新的选项卡(chrome.tab.create({"url“:"someurl"})。对于每个新选项卡,您的内容脚本都应该运行,并且您可以使用您的测试框架来检查您的代码是否完成了它应该做的事情。
至于框架,
JsUnit
或更新的
茉莉
应该工作得很好。
发布于 2014-11-06 20:41:14
在做几个chrome扩展时,我想到了
允许使用以下命令运行单元测试的项目
和
..。
基本上,它创建了所有的sinon mock
API,您可以在其中放置任何预定义的json响应。
接下来,使用node的
对于背景页和
用于渲染弹出/选项页面。
最后,您断言使用所需的参数调用了chrome api。
让我们举个例子:
假设我们有一个简单的chrome扩展,它在按钮标记中显示打开的标签数量。
背景页:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
要测试它,我们需要:
模拟
返回预定义的响应,例如两个选项卡。
注入我们的mocked
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"
});
现在我们可以把它包进摩卡咖啡里了
函数,并从终端运行:
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
你可以找到完整的例子
这里
..。
此外,sinon-chrome允许使用预定义的响应触发任何chrome事件,例如
chrome.tab.onCreated.trigger({url: 'http://google.com'});
发布于 2018-01-29 23:51:48
而
似乎工作很好,你也可以只使用普通的茉莉和模拟你需要的Chrome回调。示例:
模拟
chrome = {
runtime: {
onMessage : {
addListener : function() {}
}
}
}
测试
describe("JSGuardian", function() {
describe("BlockCache", function() {
beforeEach(function() {
this.blockCache = new BlockCache();
});
it("should recognize added urls", function() {
this.blockCache.add("http://some.url");
expect(this.blockCache.allow("http://some.url")).toBe(false);
});
} // ... etc
只需修改默认设置
来运行你的代码。
https://stackoverflow.com/questions/2869827
复制相似问题