【问题标题】:How to test opening new tab with Jasmine in Chrome extension?如何在 Chrome 扩展程序中测试用 Jasmine 打开新标签页?
【发布时间】:2014-01-04 02:57:23
【问题描述】:

我正在构建 chrome 扩展程序,但在让测试按我希望的方式工作时遇到了一些问题。我只需转到以 tests.html 结尾的扩展 url 即可访问此页面。

假设我想测试以下非常简单的场景:新选项卡在 chrome 中打开并加载,我的扩展程序检测到此事件,新选项卡添加到我的应用程序中的选项卡数组中。我所有的 Jasmine 测试都在一个单独的扩展页面中。

我尝试了以下方法,但都失败了。

一,尝试用一些超时(加载页面所需)调用 Jasmine“预期”。

describe("Tab collection", function () {
    it("after opening new tab it should be in app.tabs", function () { 
        chrome.tabs.create({"url":"http://www.google.com"});
        setTimeout(function () {
            expect(app.tabs.length).toBe(1);
            console.log("app.tabs.length after timeout", app.tabs.length);
        },100);
    });

Console.log 没有记录任何内容,测试是绿色的,甚至很明显它没有运行。

二,尝试在 chrome.tabs.create 回调函数中运行 'expect'。

    it("after opening new tab it shoule be in app.tabs", function () {
        chrome.tabs.create({"url":"http://www.google.com"}, function () {
            expect(app.tabs.length).toBe(1); //
            console.log("app.tabs.length in callback to chrome.tabs.create",app.tabs.length); 
        })
    });
});

Console.log 记录为 0,但由于某些原因测试通过。为什么 app.tabs.length 为 0 会通过?

第三种情况涉及在打开新的 chrome 标签后运行我的所有测试。有点意思

chrome.tabs.open({some_url},function (tab) {
    execJasmine()
    chrome.tabs.remove(tab['id'])
})

这可行,但非常不方便,我的所有测试现在都使用这个打开的选项卡运行。它真的不允许我测试东西。

第四次我尝试用 Jasmine BeforeEach 来做到这一点

beforeEach(function () {
    chrome.tabs.create(some_url);
}); 

这最接近没问题,但现在测试失败,app.tabs.length 为 0,因为调用测试套件时页面尚未加载。

有没有人遇到过类似的问题?如何测试描述的场景?

【问题讨论】:

  • (顺便说一句,由于 2.x 版本引入了一些重大更改,请务必在询问 Jasmine 相关问题时提及您使用的版本。)
  • 你如何运行这个测试?它如何访问 chrome.tabs.create?我也在寻找一种方法来测试我的扩展。 :) 我一直在尝试使用 phantomjs,但据我所知,它不是基于 chrome 的。

标签: javascript google-chrome-extension jasmine


【解决方案1】:

您的测试是同步的。您必须在it 的回调中声明第二个参数以使您的测试异步:

describe("Tab collection", function () {
    it("after opening new tab it should be in app.tabs", function(done) {
        //                                                        ^^^^
        chrome.tabs.create({"url":"http://www.google.com"}, function() {
            expect(app.tabs.length).toBe(1);
            console.log("app.tabs.length after timeout", app.tabs.length);
            done(); // <------
        });
    });
    // ...
});

【讨论】:

  • 好的,测试通过了,但是控制台记录的值为0,是不是因为在expect执行之前调用了console.log?
  • @Pawelmhm 不,“app.tabs.length”是一个数字,所以console.log 不会懒惰地评估它的值。如果您看到不一致的结果,那么您设置 app.tabs.length 的方法可能存在缺陷。
  • @Pawelmhm:还有一件事要检查:如何/何时向app.tabs 添加标签也可能发挥作用。 chrome.tabs.create() 的回调在选项卡创建后执行,但这不会告诉您有关选项卡状态的任何信息。根据您在app.tabs 列表中添加新选项卡的方式/时间,可以在检测到新选项卡并将其添加到列表之前执行回调。
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多