Jasmine 4:异步功能未在 5000 毫秒内完成问题

Jasmine 4: Async function did not complete within 5000ms issue

我有一个现有的异步函数:

  async doJSONGetRequest(getUrl, accessToken) {
    return new Promise(function(resolve, reject) {
      const reqHeaders = {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${accessToken}`,
      };

      console.info('url = ' + getUrl);
      request.get({
        url: getUrl,
        headers: reqHeaders,
      }, function(err, response) {
        if (err) return reject(err);
        try {
          // console.debug(`response = ${response.body}`);
          const parsed = JSON.parse(response.body);
          return resolve(parsed);
        } catch (err) {
          return reject(err);
        }
      });
    });
  }
}

我正在尝试使用 Jasmine(v4) 对其进行测试。 当然,我不希望这个东西实际发出 HTTP 请求,所以我尝试在 'beforeAll' 部分的 'request' 包的 'get' 函数上安装一个间谍:

describe('RAPIDAPIService', function() {
  beforeAll(async function() {
    spyOn(request, 'get')
      .and
      .callFake(async (parameters) => {
        if (parameters.url === 'http://localhost/api/getSomething') {
          const rsp = {};
          rsp.body = 'good stuff';
          return rsp;
        } else if (parameters.url === 'http://localhost/api/whoops') {
          return new Error('401 not found');
        } else {
          return null;
        }
      });
  });


  it('doJSONGetRequest should run successfully', async () => {
    expect(api.doJSONGetRequest).toBeDefined();
    const res = await api.doJSONGetRequest('http://localhost/api/getSomething', '12345678');
    expect(data).toEqual('good stuff');
  });

  it('doJSONGetRequest should resolve errors properly', async () => {
    expect(api.doJSONGetRequest).toBeDefined();
    const res = await api.doJSONGetRequest('http://localhost/api/whoops', '12345678');
    const expectedError = new Error('401 not found');
    expect(res).toEqual(expectedError);
  });

控制台日志语句似乎表明我实际上正在通过“it”测试中的“await”调用返回/返回某些内容。但间谍实际上正在工作/检测到 url 已被调用。

(请注意,我没有在同一个文件中包含其他测试,这些测试不会进行异步调用并且正在运行...只是为了让您知道访问实际的“api”没有问题图书馆及其功能。)

这两个测试一直失败,并显示“错误:超时 - 异步功能未在 5000 毫秒内完成”。就像我说的,他们似乎没有从调用 doJSONGetRequest 函数返回到测试。

有什么想法吗?

谢谢!

我认为问题出在嘲讽上。 request.get 似乎有两个参数,我认为您需要在完成后调用第二个参数(回调函数),以便可以调用 resolve

试试这个:

spyOn(request, 'get')
      .and
      // add callbackFunction as 2nd argument
      .callFake((parameters, callbackFunction) => {
        if (parameters.url === 'http://localhost/api/getSomething') {
          const rsp = {};
          rsp.body = 'good stuff';
          callbackFunction(null, rsp);
        } else if (parameters.url === 'http://localhost/api/whoops') {
          callbackFunction({ error: '401 not found' }, {});
        } else {
          callbackFunction(null, null);
        }
      });