实习AJAX单元测试

时间:2013-05-24 16:29:07

标签: javascript jquery ajax testing intern

我遇到了Intern如何运行测试以及尝试使用jQuery测试使用AJAX调用的单元的问题。由于Intern将测试客户端提供给WebDriver服务器(在本例中为phantomjs --webdriver=8910),我最终会在localhost:9000上运行测试。这显然会导致同源政策问题。

我可以绕过这个并提出跨域请求,但是一旦需要身份验证cookie,我就会被阻止,因为很明显我们的后端没有为localhost设置cookie,所以我无法访问这些cookie。

我尝试将proxyUrl选项更改为指向我们的服务器的几种不同的排列,但到目前为止没有任何效果:

https://my.server.com/
https://my.server.com/js/
https://my.server.com/js/intern/
https://my.server.com/js/intern/client.html
https://my.server.com/js/intern/client.html?config=tests/intern

观察WebDriver日志我注意到Intern告诉服务器加载http://localhost:9000/__intern/client.html?config=...。我已尝试将proxyUrl设置为https://my.server.com/js/并将符号链接__intern设置为intern,但测试未运行或未报告回{ {1}}。我以这种方式运行的PhantomJS日志看起来像这样:

runner.js

然后,测试运行器会挂起并且永远不会收到测试结果,因为[DEBUG - 2013-05-24T15:17:50.930Z] SessionReqHand - _postUrlCommand - Session '194ff0a0-c485-11e2-9c64-9986b0c95ae1' is about to load URL: https://my.server.com/js/__intern/client.html?config=tests%2Fintern&sessionId=194ff0a0-c485-11e2-9c64-9986b0c95ae1&reporters=webdriver [DEBUG - 2013-05-24T15:17:50.943Z] Session [194ff0a0-c485-11e2-9c64-9986b0c95ae1] - _execFuncAndWaitForLoadDecorator - Page Loading in Session: true [DEBUG - 2013-05-24T15:17:50.962Z] Session [194ff0a0-c485-11e2-9c64-9986b0c95ae1] - _oneShotCallback - onLoadFinished [DEBUG - 2013-05-24T15:17:50.962Z] Session [194ff0a0-c485-11e2-9c64-9986b0c95ae1] - _execFuncAndWaitForLoadDecorator - onLoadFinished: success [DEBUG - 2013-05-24T15:17:51.051Z] Session [194ff0a0-c485-11e2-9c64-9986b0c95ae1] - _execFuncAndWaitForLoadDecorator - Page Loading in Session: false [DEBUG - 2013-05-24T15:17:51.051Z] Session [194ff0a0-c485-11e2-9c64-9986b0c95ae1] - _resetOneShotCallbacksDecorator [DEBUG - 2013-05-24T15:17:51.052Z] SessionReqHand - _SuccessHandler - status: success [DEBUG - 2013-05-24T15:17:51.184Z] Session [194ff0a0-c485-11e2-9c64-9986b0c95ae1] - page.onConsoleMessage - Tests complete 未指向Intern运行的代理服务器。

编辑5/28

值得一提的是,通过后端修改可以避免很多这种情况(尽管理想情况下,测试堆栈应该是可配置的,以适应代码库,而不是强制代码库符合),但我们只是说在这里这种情况不是一种选择。

理想情况下,我希望Intern可配置为从指定的URL加载proxyUrl,然后通过一些跨源兼容的方式(如JSONP)让报告者POST到client.html代理。我找不到任何其他合理的替代方案,所以看起来目前Intern并不完全支持通过AJAX与后端通信的单元测试。

2 个答案:

答案 0 :(得分:2)

当您将Intern代理的URL更改为指向另一台服务器时,它需要是一台实际代理回到localhost:9000运行的Intern服务器的服务器。它不能只是一个带有符号链接到Intern目录的普通Web服务器。

执行此操作与任何其他类型的代理到另一个后端(CouchDB,Apache,Node.js,无论如何)相同。对于nginx,这意味着使用HttpProxyModuleproxy_pass http://localhost:9000/;。对于Apache,mod_proxyProxyPass / http://localhost:9000/。请记住,如果您不允许Intern服务器为您的JavaScript提供服务(即您只代理__intern),则不会收到代码覆盖率数据,因此最好代理除服务URL之外的所有内容。试图测试。

有关代理Intern以测试Web服务的更多完整信息,请访问Wiki页面Using Intern to unit test Ajax calls

答案 1 :(得分:0)

看起来还有一个新的维基页面概述了这些信息:Using Intern to unit tests Ajax calls