Тайм-аут Jyn асинхронного теста истекает, если в функции асинхронности вызывается "ожидайте". Работает иногда. "Асинхронный обратный вызов не был запущен в течение указанного времени"

Я использую Jest с JS и пытаюсь написать тест для библиотеки X-ray JS, веб-инструментария. Ниже приводится тест. Это использует Jest 18.x и последние рентгеновские снимки от 20.02.2017.

const htmlResponse = require('../__mocks__/html_response'); // just contains {listingsPage: '<html>....</html>';}

describe('scraper', () => {
    it("should get David Nichols' latest study from valid HTML", (done) => {
        var listingsHtml = htmlResponse.listingsPage;
        const Xray = require('x-ray');
        const x = Xray();
        expect(x).not.toEqual(null);
        var parseHtml = x('#Repo tbody tr', { link: 'td:nth-child(1) a@href' })
        parseHtml(listingsHtml, (err, result) => {
            console.log(Object.keys(result));
            expect(result.link).toEqual('le test'); // commenting this out causes test to pass.
            done();
        });
});

Если я удалю expect().toEqual позвонить внутри обратного вызова над done() Тест проходит:

 PASS  src/__tests__/scraper-test.js

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        2.315s, estimated 6s
Ran all test suites related to changed files.

с этой линией, как есть, время ожидания истекло. result простой объект {link: 'string'} Тест не делает никаких сетевых вызовов. Я попытался обновить значение тайм-аута до 30 секунд, но безуспешно.

 FAIL  src/__tests__/scraper-test.js (5.787s)

  ● scraper › should get David Nichols' latest study from valid HTML

    Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

      at Timeout.callback [as _onTimeout] (node_modules/jest-environment-jsdom/node_modules/jsdom/lib/jsdom/browser/Window.js:480:19)
      at ontimeout (timers.js:365:14)
      at tryOnTimeout (timers.js:237:5)
      at Timer.listOnTimeout (timers.js:207:5)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        6.641s
Ran all test suites related to changed files.

1 ответ

Проблема в том, что вы не можете предсказать, сколько времени потребуется, чтобы получить результат. Что вы можете сделать, это создать обещания, которые разрешаются в обратном вызове и вернуть это обещание из вашего теста

    const htmlResponse = require('../__mocks__/html_response'); // just contains {listingsPage: '<html>....</html>';}
describe('scraper', () = > {
    it("should get David Nichols' latest study from valid HTML", (done) = > {
      const Xray = require('x-ray');
      const x = Xray();
      expect(x)
        .not.toEqual(null);
      var parseHtml = x('#Repo tbody tr', {
        link: 'td:nth-child(1) a@href'
      })
      return  new Promise((resolve) = > {
        var listingsHtml = htmlResponse.listingsPage;
        parseHtml(listingsHtml, (err, result) = > {
          resolve(result);
        });
      })
      .then((result = > {
        expect(result.link)
          .toEqual('le test'); // commenting this out causes test to pass.
      }))
    });
Другие вопросы по тегам