嗨,大家好,
我使用的是karma-sinon
并且默认情况下始终安装Sinon的最新版本。 似乎1.17.4版对我来说是这样的:
this.server.requests[0].respond(500, { 'Content-Type' : 'application/json' }, JSON.stringify({}));
它不会在我的Ajax调用中调用错误处理程序。 由于某种原因,我什至在Github上都找不到此版本的标签,以帮助调试问题。 作为一种解决方法,为了安全起见,我已降级到1.17.3并在项目上运行了wrapwrap。
您期望发生什么?
Ajax错误将被触发。
实际发生了什么
我不会触发我的Ajax错误处理程序。
如何繁殖
this.server = sinon.fakeServer.create();
this.server.requests[0].respond(500, { 'Content-Type' : 'application/json' }, JSON.stringify({}));
我可以确认这是在1.17.4上发生的,而不是在1.17.3上发生的。 我对业力-西农也有类似的设置。
标记1.17.4
被推送到npm注册表,但是在此存储库中没有找到该标记的任何痕迹。 发生了什么?
我的猜测是尚未创建标签。 仅在3个小时前发布
@mbarlock是的,尽管如此,但是我认为,如果首先发布GitHub上的标签会更好。 至少我们会在PR或要解决的问题上寻找并提供帮助。
我的错。 忘记了git push --tags
。 感谢您提供有关错误的信息。
我刚刚确认commit 2cfbacd在mozilla / loop#400中肯定导致测试失败。
我在本地应用了#1031的补丁,它修复了我们的测试。
如果1.17.4更改了现有行为,那么它不应该成为新的主要版本的一部分吗? 当前,它被认为与1.17.3兼容,因此将sinon依赖项指定为“ ^ 1.17.3”的package.json将获得1.17.4并可能失败,而该测试过去一直有效。
1.17.3的工作方式不过是一种回归,对吗? 随时纠正我。 如果是这种情况,则应将其固定,而不应保持其破裂状态。
更新:这看起来像一个实际的错误。
哦,我还没有阅读您对https://github.com/sinonjs/sinon/pull/861 @fearphage的原始讨论。 看来这确实是正确的行为,尽管考虑到该错误在Sinon代码库中存在了多长时间,但我认为这将产生超出预期的影响。
鉴于此,看来对我而言正确的做法是将测试更改为依赖xhr.onabort而不是xhr.onerror。 我怀疑这种更改会在一段时间内引起混乱,因为本地运行的单元测试不会自动重新下载所有依赖项(如果它们存在于node_modules目录中),因此人们在向其添加新的依赖项时会发现有关此问题的信息。 package.json(我很快意识到,因为Travis CI会从头开始为我的测试安装npm)。
我不确定正确的做法是什么。 也许在1.17.4的变更日志中添加一条注释,指定某些依赖于“ onerror”的测试应使用“ onabort”? (顺便说一下,截至此评论,http://sinonjs.org/Changelog.txt尚不包含1.17.4)。
我收回之前说过的话。 我研究了如何修复测试,并意识到在https://github.com/sinonjs/sinon/commit/2cfbacd5cea5b63c014076d3a65b6642b2200793中引入了一个新错误。 现在,onReadyStateChange函数将触发“错误” ProgressEvent,而不是依赖中止函数(如果已定义)直接调用onerror。 问题是FakeXMLHttpRequest当前没有“错误”事件的侦听器。
我创建了PR https://github.com/sinonjs/sinon/pull/1042,以添加缺少的错误eventListener键。 没有此更改,任何检查在合法服务器错误响应(例如500)上调用onerror处理函数的单元测试都将失败。 让我知道你的想法,@fearphage @ fatso83
最初阅读此线程时,我没有看到https://github.com/sinonjs/sinon/pull/1041 ,它添加了缺少的eventListener键和额外的代码来声明事件的顺序。 如果不这样做,请不要理会我的公关。
OK,#1041(与#1042相同)现已合并。
@overcaffeinated关于由于缺少文档的构建脚本而导致的更新日志丢失,导致我无法对其进行更新(请参阅https://github.com/sinonjs/sinon/issues/991#issuecomment-216651347)。 对于那个很抱歉。 希望我们可以再次使用它,并在此处添加有关更改的注释。
这样的东西使我真的很想把2.0发布出去,这样我们就不会在1.x分支上投入太多精力。
1.7.4导致我的一些测试失败。 我们期望1.7.5解决这个问题吗?
不幸的是,它无法为所有人解决,因为#1031尚未修复。 今天晚上我会尽力帮助。
感谢您的信息, @ Standard8 !
我根据对XHR规范的解释解决了这个问题。 如果有一个浏览器实现来比较它,以确保这次是正确的,那就太好了。 我们需要一个测试平台,以将sinon的虚假xhr实现与现实进行比较,以确保事件以正确的顺序触发并触发了正确的事件。
有没有人?
@fearphage知道这样的测试台看起来如何吗? 一套手动测试? 很难在普通浏览器中模拟“网络中断”。 所以我不太确定该怎么做。
这似乎是极好的资源! 顺便说一句,Browserscope已关闭。
@fearphage我没有时间弄清楚如何将某些东西带入www.browserscope.org ,所以我改了一个网页:
http://people.mozilla.org/~mbanner2/sinonXHRBrowserTest.html
加载最新版本的Firefox,Chrome,IE和Safari。
@ Standard8我很感激。 我一直在用它来比较sinon的假服务器实现。 谢谢你。
@fearphage @ fatso83 ,能否请您概述此问题的当前状态?
从快速浏览开始,听起来我们应该考虑还原v1.17.3功能并提供v1.17.5版本-即使旧功能被破坏了,这也代表着API的重大变化,因此应该移植到2.0版本中吗?
我想您总结得很好,尽管@fearphage在此方面的细节更多。 我一直不知所措,试图将v1.17分支中的内容和master
中的内容牢记在心。 我_多数问题已在master
,但我认为v1.17分支(没有诸如#1031和#1041 AFAIK之类的修复程序)适用。 我可能是(可能是)错误的。
我认为最实用的解决方案可能是按照您所说的去做:
master
然后在迁移指南中记录更改的内容(请参阅#1090)。我只是在追赶这里发生的事情。 修复比恢复好吗?
最大的变化是,是否触发了error
/ onerror
,对吗?
@fearphage感谢您的参与! 由于我比较慢,所以请您对所有修订均已应用于v1.17分支的现有最终用户的观点进行五行总结,以了解哪些API更改会显而易见?
尽管对于新的主要版本而言,可以进行较大的更改,但是任何开始破坏1.x中的许多测试的内容都应该搁置,但是我不确定是否已将这些修订应用于master
将解决人们在1.17.4中遇到的大多数问题。
据我了解,唯一中断的是非200个请求仍应触发error
事件。 还有更多吗? 我相信它所需要的只是大师的修复。
从Github和NPM中拉v1.7.4
似乎也是一个好主意。 大多数人正在还原它或无法升级到它。
如果这一切都改变了,我建议您仅包括已纳入master
的修复程序,并尽快发布1.17.5版本。 你能做到吗? 我要去度假( Date.now()
)。
由于删除NPM版本不是很“好”,因此我为npm deprecate
1.17.4发出了
听起来像是个计划。 这个周末我应该可以去的。
如果有人想参与#1102的工作,我已经针对此问题提出了解决方案。
如果有人需要它,我会稍微修改@ Standard8的测试文件,这就是我用来使伪造的xhr更接近浏览器行为的方式。
https://dl.dropboxusercontent.com/u/2400/tc/sinon/xhr-browser-test.htm
@ Standard8再次感谢! :拍:
根据规范,仅当网络级别的事件(例如DNS超时或服务器无响应)发生时,才会触发onerror事件。 500或404只是正常的HTTP响应,由应用程序来确定是否符合错误。 https://www.w3.org/TR/XMLHttpRequest/#event -xhr-error
规格像往常一样简洁。 jQuery将非2xx响应视为错误,这就是XMLHttpRequest的行为使很多人感到困惑的原因。
@ nyk0r :这几乎是Phred的修复程序所做的:)
@gil :应该通过@fearphage在#1102,#1108和#1109中的出色工作来解决。 由于您的测试用例不完整(没有检查/验证),您是否愿意验证它确实已被当前v1.17分支中的代码所修复? 如果您这样做,我们可以尽快发布新的修补程序版本。
或者, @ wlepinski或@mbarlock可以验证此错误已在v1.17
分支中得到解决? 只需将package.json
的sinon依赖关系更改为: sinon#v1.17
即可直接从GitHub使用正确的分支。
好的,通过运行此测试验证是否可以解决:
"call load handler on non-2xx statuses" : function(){
var stub = sinon.stub();
this.xhr.addEventListener("load", stub);
this.xhr.open("GET", "/");
this.xhr.send();
this.xhr.respond(500, { 'Content-Type' : 'application/json' }, JSON.stringify({}));
assert(stub.called);
}
这不适用于1.17.4,但适用于最新的修复程序。
原来@fearphage已经在bf709a7f(第1797行)中涵盖了此测试,但是...
固定关闭。
不幸的是,我现在无法再对该项目进行测试,我现在正在一家新公司工作。 但是,如果他们想更新库,我会让他们知道。 谢谢修复!!
最有用的评论
听起来像是个计划。 这个周末我应该可以去的。