我遇到了 Intern 如何运行测试的问题,并尝试通过 jQuery 测试使用 AJAX 调用的单元。由于 Intern 将测试客户端提供给 WebDriver 服务器(在这种情况下phantomjs --webdriver=8910
),我最终会在localhost:9000
. 这显然会导致同源策略问题。
我可以解决这个问题并提出跨域请求,但是一旦需要身份验证 cookie,我就会被阻止,因为显然我们的后端没有为 设置 cookie localhost
,所以我无法访问这些 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
,但要么测试未运行,要么未报告回runner.js
. 当我以这种方式运行时,PhantomJS 日志看起来像这样:
[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
然后,测试运行程序挂起并且永远不会收到测试结果,因为proxyUrl
没有指向 Intern 运行的代理服务器。
编辑 5/28
值得一提的是,其中很多都可以通过后端修改来规避(尽管理想情况下,测试堆栈应该是可配置的以适应代码库,而不是强制代码库符合),但我们只是说在这种情况下不是一个选项。
理想情况下,我希望 Intern 可以配置为client.html
从指定的 URL 加载,然后让记者localhost:9000
通过一些跨域兼容的方式(如 JSONP)发布到代理。我找不到任何其他合理的替代方案,所以目前看起来 Intern 根本不完全支持通过 AJAX 与后端通信的单元测试。