Sinon.useFakeXMLHttpRequest XHR构造函数行为差异的解决方法

时间:2018-10-11 03:40:24

标签: javascript xmlhttprequest sinon

将Jest与sinon和jsdom结合使用,我试图模拟由我的一个依赖项发出的xhr请求。我的测试仅需要证明此时正确的xhr代码已被调用。

不幸的是,我对XMLHttpRequest的伪版本的构造函数的行为有疑问。似乎不喜欢将字符串作为构造函数,而依赖项是与IE向后兼容所依赖的;在XmlHttpRequest的“实际”版本中,我认为该参数将被忽略。

依赖项的代码将调用:new(window.XMLHttpRequest || ActiveXObject)('MSXML2.XMLHTTP.3.0')(对于需要它的旧版IE,可能会回退到新的ActiveXObject('MSXML2.XMLHTTP.3.0'))。

我的Jest setup.js基本上是这样的:

import ...

global.sinon = require('sinon')

我的测试或多或少是这样的:

  var requests, xhr

  beforeEach(function () {
    requests = []
    xhr = sinon.useFakeXMLHttpRequest()

    xhr.onCreate = function (xhr) {
      return requests.push(xhr)
    }
  })

  afterEach(function () {
    xhr.restore()
  })

  function afterNotify (done, run) {
    setTimeout(function () {
      run()
      done()
    }, 50)
  }

  it('should send a message via MyDependency', (done) => {
    MyDependency.myMethod('My Argument')
    afterNotify(done, function () {
      expect(requests.length).toEqual(1)
    })
  })

一旦我调用sinon.useFakeXMLHttpRequest(),window.XMLHttpRequest构造函数(现在是锡南的版本)似乎期望包含{ logger: SomeLogger }而不是字符串的对象,因此它会与Error encountered during XHR request (will retry): TypeError: Cannot create property 'logger' on string 'MSXML2.XMLHTTP.3.0'.发生错误

如果我强行将原始依赖项仅使用默认构造函数而不是该'MSXML2.XMLHTTP.3.0'字符串,我的测试将按预期方式通过,但是我想知道是否存在一种合理的方法来覆盖sinon的行为XMLHttpRequest对象,这样我就不必更改依赖项。

有什么想法吗?

0 个答案:

没有答案