0

我正在测试使用以下命令发出的 AJAX 请求XMLHttpRequest

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

4

1 回答 1

2

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

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

于 2017-02-08T17:56:21.667 回答