Были даны тесты и нужно было написать реализацию метода объекта. Код выполняющий данный метод асинхронный, внутри 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 в другом блоке проверок? И когда тестируешь методы объекта, то порядок важен?