2014-08-29 2 views
0

Я пытался собрать небольшой пример, чтобы показать сотрудников, но не могу понять, что не так с этим тестом that I've put in a gist.Что случилось с этим модульным тестом функции async JavaScript (через Mocha/Sinon)?

По существу я хочу проверить функцию, которая делает что-то асинхра, но использовать шпион Синона() функциональность для обеспечения его завершения:

function asyncHello(name, delay, cb) { 
    setTimeout(function() { 
    console.log("running after ", delay); 
    cb("hello " + name); 
    }, delay); 
} 



suite('Mega Suite', function(){ 

    suite("testing async hello", function() { 
    test('should call the callback', function(done) { 
     var cb = sinon.spy(); 
     asyncHello("foo", cb); 

     cb.should.have.been.called(); 
     done(); 
    }); 
    }); 
}); 

мысль с помощью Mocha и сделано(), чтобы решить тест, который зависит от асинхронная функция (setTimeout, в данном случае) будет работать, но, возможно, кто-то может указать, где я ошибаюсь. Благодаря!

ответ

0

Вам не нужно Sinon для этого:

function asyncHello(name, delay, cb) { 
    setTimeout(function() { 
    console.log("running after ", delay); 
    cb("hello " + name); 
    }, delay); 
} 

suite('Mega Suite', function(){ 
    suite("testing async hello", function() { 
    test('should call the callback', function(done) { 
     asyncHello("foo", 1000, function() { 
     done(); 
     }); 
    }); 
    }); 
}); 

Существовали две проблемы в этом коде:

  1. Вы называли asyncHello("foo", cb);, которые сделали это так, чтобы ваш delay аргумент внутри функции был установлено значение cb, а аргумент cb внутри функции не определен.

  2. Даже после фиксации 1-й элемент cb.should.have.been.called(); был вызван до выполнения функции, переданной в setTimeout.

    В основном вам не нужно использовать Sinon, потому что если вы просто установите обратный вызов для вызова done(), тогда вы знаете, что тест прошел успешно. Если есть проблема, то done() не будет вызван, и тест не удастся.

+0

Yup, глупая ошибка с моей стороны. Спасибо что подметил это. :) Отмечено, что вы не используете Sinon, но что такое «правильный» способ использовать Sinon в случае, когда я хочу заглянуть в функцию, которая собирается выполнить асинхронный вызов? Я думаю о чем-то вроде теста интеграции, где я хочу убедиться, что модуль делает правильный вызов (скажем, http.get()) с учетом обстоятельств (т. Е. Промаха в кеше, поэтому пойдите, чтобы получить некоторые данные). Но я не хочу ударять по сети в тесте все время. – virtualandy

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