Извините заранее за длинный квест. Я стараюсь как можно яснее разобраться с проблемой, с которой я сталкиваюсь.
Я создал декораторы использует библиотеку , и я столкнулся со странным поведением при работе с одним из декораторов ( https://github.com/vlio20/utils-decorators/blob/master/src/after/after.ts).
Декоратор называется «после», и он должен выполнять другую функцию после выполнения декорированного метода. Но в том-то и дело, что если функция возвращает обещание, декоратор должен дождаться его разрешения и только потом вызывать после fun c.
Вот соответствующий код:
if (resolvedConfig.wait) {
const response = await originalMethod.apply(this, args);
afterFunc({
args,
response
});
} else {
const response = originalMethod.apply(this, args);
afterFunc({
args,
response
});
}
Как вы видите, я предоставляю флаг декоратору, чтобы указать, что декорированный метод является асин c функцией и возвращает Обещание. Я был бы счастлив прочитать этот флаг, имея следующий код:
const response = await originalMethod.apply(this, args);
afterFunc({
args,
response
});
По сути, я хочу всегда ставить await
перед выполнением исходного метода, как я понимаю в случае syn c метод, ожидающий ничего не делает.
Проблема в том, что когда я изменяю код, как предложено выше, следующий модульный тест завершается неудачно:
it('should verify after method invocation when method is provided', () => {
let counter = 0;
const afterFunc = jest.fn(() => {
expect(counter).toBe(1);
});
class T {
@after<T, void>({
func: afterFunc
})
foo(x: number): void {
return this.goo(x);
}
goo(x: number): void {
expect(counter++).toBe(0);
return;
}
}
const t = new T();
const spyGoo = jest.spyOn(T.prototype, 'goo');
t.foo(1);
expect(spyGoo).toBeCalledTimes(1);
expect(spyGoo).toBeCalledWith(1);
expect(afterFunc.mock.calls.length).toBe(1); // this line fails
});
I создали форк библиотеки, в которой этот точный тест не пройден (https://github.com/vlio20/utils-decorators/pull/new/after-issue).
Что не так с моим восприятием?