Обходной путь для различия в поведении конструктора XHR Sinon.useFakeXMLHttpRequest - PullRequest
0 голосов
/ 11 октября 2018

Используя Jest с sinon и jsdom, я пытаюсь смоделировать запрос xhr, сделанный одной из моих зависимостей.Мой тест должен только доказать, что в этот момент вызывается правильный код xhr.

К сожалению, у меня проблема с поведением конструктора фальшивой версии XMLHttpRequest. Кажется, ему не нравится иметь строку в качестве конструктора, на которую опирается зависимость для обратной совместимости с IE;в «настоящей» версии XmlHttpRequest я считаю, что этот параметр просто игнорируется.

Код зависимости вызывает: new(window.XMLHttpRequest || ActiveXObject)('MSXML2.XMLHTTP.3.0') (предположительно для возврата к новому ActiveXObject('MSXML2.XMLHTTP.3.0') для более старых версий IE, которым это необходимо).

мой 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' мой тест проходит, как и ожидалось, но мне интересно, есть ли разумный способ переопределить поведение объекта XMLHttpRequest sinon, чтобы мне не пришлось изменять зависимость.

Есть идеи?

...