@cbolota

Важен ли порядок выполнения в тестах (асинхронность)?

Были даны тесты и нужно было написать реализацию метода объекта. Код выполняющий данный метод асинхронный, внутри setTimeout. Тесты на JEST.
Пример одного блока:
describe('Method findPart', () => {
        it('It should execute callback with found member by given function', (done) => {
            const member = { level: 'junior', firstName: 'Jon' };
            party.init([member], {});
            party.findPart((item) => item.firstName === 'Jon', (result) => {
                expect(result).toEqual(member);
                done();
            });
        });

        it('It should execute callback with null as first argument if member wasn\'t found', (done) => {
            const member = {level: 'junior', firstName: 'Jon' };
            party.init([member], {});
            party.findPart((item) => item.firstName === 'Foo', (result) => {
                expect(result).toBeNull();
                done();
            });
        });

        it('It should set isBusy to true on work start', () => {
            party.findPart(() => {}, () => {});
            expect(party.isBusy).toBe(true);
        });

        it('It should set isBusy to false on work end', (done) => {   
            party.findPart(() => {}, () => {
                expect(party.isBusy).toBe(false);
                done();
            });
        });

    });

// сам метод
findPart(func, callbackFunction) {
            
            if (this.isBusy || (typeof callbackFunction !== "function")) {
              return false;
            }

            this.isBusy = true;
            const find = this.members.find(func)
            
              setTimeout(function() {
                this.isBusy = false;
                if (find) {
                  callbackFunction(find)
                } else {
                  callbackFunction(null)
                }
              }.bind(this), 100)
}


Выполняя тесты, последняя проверка выдает ошибку "Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL". Поменяв местами 3 и 4 проверки, все тесты работают. Пройдя последний тест отдельно - выполняется. Спросил нужна ли функция done() в 3 проверке, сказали, что не нужна и необходимо изменить метод.

// Все работает
it('It should set isBusy to true on work start', (done) => {
            party.findPart(() => {}, () => {done()});
            expect(party.isBusy).toBe(true);
        });


Просто интересует, может ли влиять асинхронность из одного блока it в другом блоке проверок? И когда тестируешь методы объекта, то порядок важен?
  • Вопрос задан
  • 232 просмотра
Решения вопроса 1
@cbolota Автор вопроса
Вопрос решен.
Правильное решение оставить done() функцию в асинхронных операциях.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы