我遇到了实习生如何运行测试以及尝试测试将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
,但是这些测试未运行或没有被报告回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配置为从指定的URL加载
client.html
,然后通过一些跨域兼容的方式(如JSONP)将报告程序POST到localhost:9000
代理。我找不到其他合理的选择,因此目前看来Intern完全不完全支持通过AJAX与后端通信的单元测试。 最佳答案
当您将指向Intern代理的URL更改为指向另一台服务器时,它必须是实际上是代理回到运行在localhost:9000
上的Intern服务器的服务器。它不能只是带有指向Intern目录的符号链接的普通Web服务器。
这样做与对其他后端(CouchDB,Apache,Node.js等)的任何其他代理方式相同。对于nginx,这意味着使用HttpProxyModule到proxy_pass http://localhost:9000/;
。对于Apache,mod_proxy和ProxyPass / http://localhost:9000/
。请记住,如果您不允许Intern服务器提供JavaScript(即,您仅代理__intern
),则不会收到代码覆盖率数据,因此最好代理除您尝试提供的服务URL之外的所有内容。测试。
可以在Wiki页面Using Intern to unit test Ajax calls上找到有关代理到Intern以测试Web服务的更多完整信息。
关于javascript - 实习生AJAX单元测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16739642/