将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对象,这样我就不必更改依赖项。
有什么想法吗?