2017-02-21 32 views
3

Я использую Jest с JS и пытаюсь написать тест вокруг X-ray JS-библиотеки, инструментария веб-скрепок. Ниже приведен тест. Это использует Jest 18.x и последние рентгеновские лучи по состоянию на 02/20/2017.Jest async проверяет время ожидания, если «ожидание» вызвано в функции async. Иногда работает. «Асинхронный обратный вызов не был вызван в указанный тайм-аут»

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) [email protected]' }) 
     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. 

ответ

2

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

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) [email protected]' 
     }) 
     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. 
     })) 
    });