blog
blog copied to clipboard
在 Protractor 中使用 $httpBackend
最近一边在做各种 AngularJS 程序,一边完善自己的 AngularJS 项目脚手架。今天想把 $httpBackend 集成到 Protractor 里面去,伤了一会儿脑筋。。
使用这个服务最简单的办法就是直接在项目里依赖它,可是每次项目上线前,我都需要回到源码里删除跟 $httpBackend
有关的代码:删除 angular-mocks.js
的引用、删除 ngMockE2E
的依赖,还要删除配置 $httpBackend
的代码段。
在 Protractor Issues 里有关于这个问题的讨论。
后来我大致看了一遍 Protractor 的文档,看到了两个关键的方法:browser.executeScript 与 browser.addMockModule。(让我吐槽一下这份文档,我网上查了一个小时,就是不知道上哪找 webdriver
来调用 executeScript
方法,后来无意中试了一下 browser.executeScript()
发现居然没报错,大概 browser
本身就是 webdriver
吧……无语了。)
我的思路是:
- 使用
browser.executeScript()
在测试开始之前用 js 的方式插入angular-mocks.js
- 使用
browser.addMockModule()
重载启动模块,在这个重载里面加入对ngMockE2E
的依赖 - 将
$httpBackend
的配置写在测试代码里
我猜想第二步与第三步是最简单的,而事实证明确实如此——第一步怎么折腾都没成功。即使我优先插入了 angular-mocks.js
,但是执行到第二步的时候会报错:ngMockE2E
模块找不到;我猜是因为执行到第二步的时候,第一步插入的脚本没有加载或执行完;本来想在第一步生成的 script
节点里加一个 onload
事件,但是 browser.executeScript()
的执行环境是在浏览器中,所以引用不到 browser
这个(仅在测试文件里才有的)变量。
后来我发现还有 browser.executeAsyncScript() 可以执行异步代码,但同时我也在这里看到,每次调用 browser.get() 的时候,页面都会重新刷新一次,也就是说,每次我都得重新插入一遍脚本,想了想还是算了。
最后只能用一个折中的办法,即在项目里面引用 angular-mocks.js
文件,这样至少每次上线前只需要注释一行代码就可以了。
感觉我的解决方案并不太好,希望以后能在工作过程中找到更好的方式。