Используя 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, чтобы мне не пришлось изменять зависимость.
Есть идеи?