2015-02-23 3 views
0

Я хочу проверить результаты, возвращаемые асинхронной функцией, с помощью nodeunit. У меня есть следующий тест:NodeUnit - Тестирование асинхронной функции

module.exports = { 
    createFail: function(assert) { 
    var user = new CRUDUser({ firstName: 'Node' }); 

    assert.equal(undefined, user.id); 

    user.create(function(res) { // user.create() makes an async AJAX call and should call this function back 
     assert.equal(false, res.success); 
     assert.equal(undefined, user.id); // user not created cause 'lastName' can't be null 

     console.log('#####'); 
     assert.done(); 
    }); 
    } 
}; 

Но когда я запускаю его я получаю следующее сообщение об ошибке:

FAILURES: Undone tests (or their setups/teardowns): 
- createFail 

To fix this, make sure all tests call test.done() 

Если я двигаю assert.done(); вызов вне функции обратного вызова, тест заканчивается перед вызовом AJAX было изготовлено.

Я также попытался добавить assert.expect(3); в самом начале теста, чтобы заставить его «ждать», пока функция обратного вызова не вызовет assert.done();, но я получаю ту же ошибку, что и выше.

Во всех случаях ожидаемый ##### не выводится на консоль, очевидно. Что я делаю не так ??

ответ

1

Основываясь на вашем выходе, моя первая теория заключается в том, что user.create просто не вызывает функцию обратного вызова. Откажитесь от этого и убедитесь, что во всех случаях (успех, сбой, тайм-аут и т. Д.) Он фактически вызывает функцию обратного вызова. Другими словами, ваш тестовый код выглядит, вероятно, ОК, но код, который вы тестируете, подозревается в ошибке.

+0

Метод 'create()' фактически вызывал обратный вызов, но без какого-либо параметра, который, я полагаю, вызвал строку 'assert.equal (false, res.success);', чтобы закончить тест. Спасибо, в любом случае. Я принимаю ваш ответ, потому что вы были как-то правы: проблема была в методе 'create()'. – Flawyte