2016-03-03 4 views
3

Я хочу, чтобы проверить, если функцию асинхронных бросков с использованием assert.throws из родного assert модуля. Я попытался сNode.js assert.throws с асинхронным функциями (Promises)

const test = async() => await aPromise(); 
assert.throws(test); // AssertionError: Missing expected exception.. 

Он (Obvioulsy?) Не работает, так как функция выходит перед Promise будет решена. Все же я нашел это question, где такие же вещи достигаются с помощью обратных вызовов.

Любое предложение?

(я transpiling на Node.js родные генераторы с использованием Бабеля)

ответ

7

На основе Bergi answer я предлагаю более универсальное решение, которое использует оригинальный assert.throws для сообщений об ошибках:

import assert from 'assert'; 

async function assertThrowsAsync(fn, regExp) { 
    let f =() => {}; 
    try { 
    await fn(); 
    } catch(e) { 
    f =() => {throw e}; 
    } finally { 
    assert.throws(f, regExp); 
    } 
} 

Использование:

it('should throw', async function() { 
    await assertThrowsAsync(async() => await asyncTask(), /Error/); 
}); 
+1

отличное решение, надеюсь, что это сделает официальная библиотека утверждений! – kristok

6

async функции никогда не бросают - они возвращаются обещания, которые могут быть отклонены.

Вы не можете использовать assert.throws с ними. Вы должны написать свое собственное асинхронное утверждение:

async function assertThrowsAsynchronously(test, error) { 
    try { 
     await test(); 
    } catch(e) { 
     if (!error || e instanceof error) 
      return "everything is fine"; 
    } 
    throw new AssertionError("Missing rejection" + (error ? " with "+error.name : "")); 
} 

и использовать его как

return assertThrowsAsynchronously(aPromise); 

в асинхронном тесте

0

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

// Code being tested 
async function thisFunctionThrows() { 
    throw new Error('Bad response') 
} 


// In your test. 
try { 
    await thisFunctionThrows() 
    assert.equal(1 == 0) // Never gets run. But if it does you know it didn't throw. 
} catch (e) { 
    assert(e.message.includes('Bad response')) 
} 
Смежные вопросы