Sinon: fakeServer在1.17.4上被.respond(500)破坏了

创建于 2016-05-02  ·  35评论  ·  资料来源: sinonjs/sinon

嗨,大家好,

我使用的是karma-sinon并且默认情况下始终安装Sinon的最新版本。 似乎1.17.4版对我来说是这样的:

this.server.requests[0].respond(500, { 'Content-Type' : 'application/json' }, JSON.stringify({}));

它不会在我的Ajax调用中调用错误处理程序。 由于某种原因,我什至在Github上都找不到此版本的标签,以帮助调试问题。 作为一种解决方法,为了安全起见,我已降级到1.17.3并在项目上运行了wrapwrap。

  • 诗乃版本:1.17.4
  • 环境:OSX
  • 您正在使用的其他库:karma-sinon

您期望发生什么?
Ajax错误将被触发。

实际发生了什么
我不会触发我的Ajax错误处理程序。

如何繁殖

this.server = sinon.fakeServer.create();
this.server.requests[0].respond(500, { 'Content-Type' : 'application/json' }, JSON.stringify({}));
Tough Help wanted Needs investigation

最有用的评论

听起来像是个计划。 这个周末我应该可以去的。

所有35条评论

我可以确认这是在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.org,或者至少可以将其用作存储结果的后端。

想象一下XHR的http://www.acidtests.org/

以下是一些基于请求的实用程序可以提供帮助:

https://httpbin.org/
http://requestb.in/

这似乎是极好的资源! 顺便说一句,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之类的修复程序)适用。 我可能是(可能是)错误的。

我认为最实用的解决方案可能是按照您所说的去做:

  • 为1.17分支还原#1017(及相关?)以降低噪音并保持网络API不变,发布1.17.5版本,并接受实现比版本2的正确性低
  • 将更改保存在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行)中涵盖了此测试,但是...

固定关闭。

不幸的是,我现在无法再对该项目进行测试,我现在正在一家新公司工作。 但是,如果他们想更新库,我会让他们知道。 谢谢修复!!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

zimtsui picture zimtsui  ·  3评论

stevenmusumeche picture stevenmusumeche  ·  3评论

stephanwlee picture stephanwlee  ·  3评论

sudhirbits picture sudhirbits  ·  4评论

andys8 picture andys8  ·  4评论