blog icon indicating copy to clipboard operation
blog copied to clipboard

在 Protractor 中使用 $httpBackend

Open lmk123 opened this issue 9 years ago • 0 comments

最近一边在做各种 AngularJS 程序,一边完善自己的 AngularJS 项目脚手架。今天想把 $httpBackend 集成到 Protractor 里面去,伤了一会儿脑筋。。

使用这个服务最简单的办法就是直接在项目里依赖它,可是每次项目上线前,我都需要回到源码里删除跟 $httpBackend 有关的代码:删除 angular-mocks.js 的引用、删除 ngMockE2E 的依赖,还要删除配置 $httpBackend 的代码段。

在 Protractor Issues 里有关于这个问题的讨论

后来我大致看了一遍 Protractor 的文档,看到了两个关键的方法:browser.executeScriptbrowser.addMockModule。(让我吐槽一下这份文档,我网上查了一个小时,就是不知道上哪找 webdriver 来调用 executeScript 方法,后来无意中试了一下 browser.executeScript() 发现居然没报错,大概 browser 本身就是 webdriver 吧……无语了。)

我的思路是:

  1. 使用 browser.executeScript() 在测试开始之前用 js 的方式插入 angular-mocks.js
  2. 使用 browser.addMockModule() 重载启动模块,在这个重载里面加入对 ngMockE2E 的依赖
  3. $httpBackend 的配置写在测试代码里

我猜想第二步与第三步是最简单的,而事实证明确实如此——第一步怎么折腾都没成功。即使我优先插入了 angular-mocks.js ,但是执行到第二步的时候会报错:ngMockE2E 模块找不到;我猜是因为执行到第二步的时候,第一步插入的脚本没有加载或执行完;本来想在第一步生成的 script 节点里加一个 onload 事件,但是 browser.executeScript() 的执行环境是在浏览器中,所以引用不到 browser 这个(仅在测试文件里才有的)变量。

后来我发现还有 browser.executeAsyncScript() 可以执行异步代码,但同时我也在这里看到,每次调用 browser.get() 的时候,页面都会重新刷新一次,也就是说,每次我都得重新插入一遍脚本,想了想还是算了。

最后只能用一个折中的办法,即在项目里面引用 angular-mocks.js 文件,这样至少每次上线前只需要注释一行代码就可以了。

感觉我的解决方案并不太好,希望以后能在工作过程中找到更好的方式。

lmk123 avatar Apr 17 '15 06:04 lmk123