Использование beforeEach для вставки фиктивных данных

Когда я использую beforeEach() для вставки фиктивных данных в БД, я получаю эту ошибку:

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

Когда я удаляю вызов beforeEach() и пробую любой тестовый пример, он работает. Так может кто-нибудь показать, как правильно использовать beforeEach()?

Вот мои данные:

let dummyData = [{
    username: "ali",
    pasword: "ali",
    email: "[email protected]"
}, {
    username: "joe",
    pasword: "joe",
    email: "[email protected]"
}
]

Вот мой beforeEach звонок:

beforeEach(async function (done) {
    try {
        let result = await User.remove({});
        User.insertMany(dummyData);
    } catch (err) {
        return done(err)
    }
})

person mahmoud farag    schedule 12.02.2020    source источник


Ответы (1)


Проблема в том, что вы не позвонили done() в свой beforeEach().

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

Кстати, done() не обязательно, так что пользоваться тоже нельзя. Итак, у вас есть два варианта:

1: позвонить done() после insertMany():

beforeEach(async function (done) {
    try {
        let result = await User.remove({});
        User.insertMany(dummyData);
        done() // <-- This line
    } catch (err) {
        return done(err)
    }
})

2: Не вызывать done() (и тест не завершится неудачно, если выполнение await пройдет 2000 мс):

beforeEach(async function () {
    try {
        let result = await User.remove({});
        User.insertMany(dummyData);
    } catch (err) {
        // do whatever you want
    }
})

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

person J.F.    schedule 23.11.2020