Nock 正在拦截我的请求,但我的 AJAX 请求出错了

Nock is intercepting my request, but my AJAX request is erroring out

我正在测试使用 XMLHttpRequest:

发出的 AJAX 请求
export default function requestToTest() {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://example.com/service');

  xhr.onload = () => {
    console.log('onload');
    // etc.
  };

  xhr.onerror = () => {
    console.log('onerror');
    // etc.
  };

  xhr.send();
}

所以我使用 Nock(和 Mocha)设置了一个测试:

describe('requestToTest()', () => {
  it('should handle a successful request', () => {
    nock('https://example.com')
      .log(console.log)
      .get('/service')
      .reply(200, { some: 'json' });

    requestToTest();

    expect( /* things I want to check */ ).to.be.true;
  });
});

当我 运行 这个测试时,xhr.onerror() 触发,而不是 xhr.onload()。但是,通过观察 Nock 对 log() 调用的输出,我可以肯定地知道 Nock 正在拦截我的 AJAX 请求,并且拦截的请求符合 Nock 的预期 URL.

为什么在我的测试中调用 xhr.onerror 而不是 xhr.onload

作为解决方法,我使用了 isomorphic-fetch 库。这个库是 XMLHttpRequest 的替代品,用于发出 AJAX 请求,并且明确设计为在浏览器环境和 Node.js/test 环境中工作或多或少相同。

一般来说,使用旨在消除浏览器中 AJAX 请求与从测试环境发出请求之间的差异的库似乎是解决此问题的方法。