在 Karma 测试中加载和使用 Service Worker

Load and use a Service Worker in Karma test

我们想写一个Service Worker,对加载的文件执行源代码转换。为了测试此功能,我们使用 Karma。

我们的测试导入源文件,在这些文件上执行源代码转换。只有 Service Worker 执行转换时测试才会成功,而当 Service Worker 不活动时测试失败。

在本地,我们可以使用 singleRun: false 启动 Karma 并观察更改的文件以重新启动测试。但是,Service Workers 对于最初加载它们的页面并不活跃。因此,除了第一个之外,每个测试用例都成功了。

但是,对于持续集成,我们需要单机-运行模式。因此,我们的 Service Worker 在测试的 运行 期间不活跃,因此失败了。 此外,两个连续的 运行s 不能解决这个问题,因为 Karma 会重新启动使用过的浏览器(所以我们失去了 Service Worker)。

那么,问题来了,如何让Service Worker在测试中可用运行? 例如,通过保留 karma 使用的浏览器实例。

在服务工作者的 activate 处理程序中调用 self.clients.claim() 向浏览器发出信号,表示您希望服务工作者控制首次注册服务工作者的初始页面加载。您可以在 Service Worker Sample: Immediate Control.

中查看实际操作示例

我建议您在受控页面的 JavaScript 中等待 navigator.serviceWorker.ready 承诺在 运行 测试代码之前解析。一旦该 promise 确实解决了,您就会知道有一个活跃的 service worker 控制着您的页面。 test for the <platinum-sw-register> Polymer element 使用此技术。