2015-12-28 3 views
2

Пожалуйста, помогите мне понять, что здесь не так:JSDOM не заканчивается

Вот мой JS код (упрощенный выделить минимальный код, необходимый для демонстрации проблемы):

'use strict'; 
var jsdom = require('jsdom'); 
describe('desc', function() { 
    it('should', function() { 
     function uploadURL(callback) { 
      jsdom.env({ 
       url: "http://digg.com", 
       done: function (errors, window) { 
        console.log("inside"); 
        callback("abc"); 
       } 
      }); 
     } 

     uploadURL(function(x){ 
      console.log("returned " + x); 
     }); 
    }); 
}); 

Вот мой Командная строка:

node_modules/mocha/bin/mocha tests/test.js

Когда я бегу выше сценарий, я получаю следующий результат:

desc 
    ✓ should (196ms) 
    1 passing (204ms) 

После того, как я удалить jsdom часть и запустить только часть uploadURL(), который содержит console.log и обратный вызов, я получаю это обратно:

desc 
inside 
returned abc 
    ✓ should 
    1 passing (5ms) 

Похоже, jsdom части не получают выполняться перед сценарий заканчивается. Почему это и как это можно решить?

Спасибо!

ответ

0

Потому что он асинхронный. Чтобы проверить асинхронную функцию с мокко, вы принимаете обратный вызов Мокко-х it обеспечивает, и назвать его, когда асинхронным делаются:

'use strict'; 
var jsdom = require('jsdom'); 
describe('desc', function() { 
    it('should', function (done) { 
    //      ^---------------------- accept the callback 
     function uploadURL(callback) { 
      jsdom.env({ 
       url: "http://digg.com", 
       done: function (errors, window) { 
        console.log("inside"); 
        callback("abc"); 
       } 
      }); 
     } 

     uploadURL(function(x){ 
      console.log("returned " + x); 
      done();       // <=== Call it 
     }); 
    }); 
}); 

Это описан в документации Мокко here.

+0

Благодарим за отзыв. К сожалению, я получаю следующую ошибку при попытке вашего предложения: Ошибка: превышен превышение 2000 мс. Убедитесь, что в этом тесте вызывается обратный вызов done(). – Katya

+0

@ Katya: Похоже, что требуется больше 2 секунд, чтобы запросить digg.com и проанализировать результат. Я ожидаю, что где-то есть параметр конфигурации, позволяющий увеличить время ожидания. –

+1

Бинго! :) Добавление обратного вызова и настройка «this.timeout (10000)»; между «описать» и «он» решил проблему. Большое спасибо! – Katya

Смежные вопросы