Подтвердить что ты не робот

Как разрешить async ждать внутри unit test - javascript

У меня есть лямбда, для которой я бы хотел написать модульные тесты. Я использую async, но я получаю проблемы с разрешением promises. Я бы хотел протестировать различные условия, как я могу написать тест для разрешения и перестать видеть таймауты?

Спасибо заранее.

Ошибка: превышен период ожидания 2000 мс. Для асинхронных тестов и перехватчиков Вызывается "done()"; если вы возвращаете обещание, убедитесь, что оно разрешено.

--- unit

describe('tests', function() {

    describe('describe an error', () => {
        it('should return a 500', (done) => {
            handler('', {}, (err, response) => {
                expect(err.status).to.eq('failed')
                done()
            })
        })
    })

});

- обработчик

export const handler = async (event, context, callback) => { 

 return callback(null, status: 500 )

})
4b9b3361

Ответ 1

Попробуйте следующее:

describe('tests', function() {
    describe('describe an error', () => {
        it('should return a 500', (done) => {
            await handler('', {}, (err, response) => {
                expect(err.status).to.eq('failed');
            })
            done();
        })
    })
});

или

describe('tests', function() {
    describe('describe an error', () => {
        it('should return a 500', async () => {
            const error = 
              await handler('', {}, (err, response) => Promise.resolve(err))
            expect(error.status).to.eq('failed');
        })
    })
});

В любом случае, я думаю, вам нужно await обработчик async...

Ответ 2

Вы можете увеличить время ожидания теста.

describe('tests', function() {

    describe('describe an error', () => {
        it('should return a 500', (done) => {
            handler('', {}, (err, response) => {
                expect(err.status).to.eq('failed')
                done()
            })
        }).timeout(5000)
    })

});

Метод timeout принимает время в ms. По умолчанию 2000

Ответ 3

В зависимости от используемой структуры существует несколько способов обработки async модульных тестов.

Например, если вы используете Jasmine:

1) Вы можете использовать Spy, чтобы заменить обратный вызов async на статическую функцию, таким образом это не будет asyncronous, и вы можете высмеять возвращаемые данные. Это может быть полезно для модульного тестирования, когда вам не нужно тестировать динамические операции async (в отличие от интеграционных тестов).

2) Существует также реальная документация поддержки async, которая может быть найдена здесь: Асинхронная поддержка

3) Вы всегда должны использовать beforeEach() с тегами async как те, где вы определяете свою функцию done() для описания уровня

Ответ 4

Используйте Синяя лента. Это тонкая обертка вокруг ленты, простая, эффективная тестовая рама, рекомендованная Эриком Эллиотом среди других.

Blue Tape обрабатывает любые тесты, которые автоматически возвращают promises.

Все методы с использованием async/await возвращают promises по спецификации ECMAScript.

Вот как выглядит

import test from 'blue-tape';

test('`functionThatReturnsAPromise` must return a status of "failed"', async ({equals}) => {
  const {result} = await functionThatReturnsAPromise();
  equals(status, 'failed');
});

Вы можете даже написать синхронные тесты таким образом, если просто введите ключевое слово async.

Обратите внимание на то, что в большинстве фреймворков нет использования done или end или любого другого шаблона и шума, связанного с асинхронным тестированием.

Я настоятельно рекомендую вам попробовать.