Как избежать предупреждений Jest: обратный вызов описания не должен возвращать значение?

После обновления Jest с версии 23 до версии 24 при запуске моих тестов я получаю такое предупреждающее сообщение почти для каждого теста:

Обратный вызов «describe» не должен возвращать значение. Возврат значения из «describe» не пройдет тест в будущей версии Jest.

Сопутствующая трассировка стека указывает на этот модуль:

addSpecsToSuite (node_modules/jest-jasmine2/build/jasmine/Env.js:443:15)

Причина этого в том, что мне нравится использовать сокращенную версию стрелочных функций для своих тестов, опуская фигурные скобки, когда тело функции содержит только один оператор, например:

describe('true', () =>
    it('should be truthy', () =>
        expect(true).toBeTruthy()));

Оператор it, по-видимому, возвращает что-то отличное от undefined, отсюда и предупреждение.

Я нашел два способа исправить это:

① Не используйте сокращенные функции со стрелками

describe('true', () => {
    it('should be truthy', () =>
        expect(true).toBeTruthy());
});

② Используйте void для принудительного возврата Undefined

describe('true', () =>
    void it('should be truthy', () =>
        expect(true).toBeTruthy()));

Я не нахожу ни один из этих вариантов приемлемым, я не хочу рефакторить тысячи тестов только для того, чтобы порадовать Джеста (или Жасмин).

Итак, мой вопрос:

Есть ли способ настроить Jest так, чтобы эти предупреждения не выдавались при использовании сокращенных функций со стрелками?


person Patrick Hund    schedule 17.03.2019    source источник
comment
По какой-либо конкретной причине, кроме личных предпочтений, вам необходимо использовать сокращенный синтаксис? Кажется, это на 100% разрешимо путем добавления фигурных скобок.   -  person Alexander Staroselsky    schedule 17.03.2019
comment
Личное предпочтение, я просто привык к этому, и мне нравится лаконичный синтаксис   -  person Patrick Hund    schedule 17.03.2019
comment
Я получаю одно и то же предупреждение с немного другой трассировкой стека независимо от того, используют ли мои describe() функции сокращенных стрелок или нет. Оказывается, это ошибка в PhpStorm, которую нужно устранить в версии 2018.3.6. Обходной путь можно найти здесь: intellij-support.jetbrains.com/hc/en-us/community/posts/   -  person urig    schedule 21.03.2019
comment
Это также происходит, когда вы вкладываете описание в описание. Эти изменения являются ошибками. Если у меня будет время, я сообщу об этом в репозитории.   -  person lonix    schedule 03.04.2019
comment
@Ionix Ну, тот факт, что они выдают подробное предупреждение об устаревании, создает впечатление, что это не ошибка, а функция.   -  person Patrick Hund    schedule 03.04.2019


Ответы (3)


Я думаю, если вы действительно хотите сохранить существующий синтаксис теста и просто хотите избежать предупреждения, вы можете сделать это:

const realDescribe = describe;
describe = ((name, fn) => { realDescribe(name, () => { fn(); }); });

Просто добавьте этот код в модуль, включенный в ваш setupFilesAfterEnv, и он запустится "немедленно". после установки тестового фреймворка в среде» и «перед каждым тестом».

Приведенный выше код установит глобальный describe в функцию, которая вызывает настоящий describe, но заключает параметр function в анонимную функцию, которая ничего не возвращает.

person Brian Adams    schedule 17.03.2019

Эта проблема также возникает, если вы используете глобальные функции, которые Jest v24 не распознает. Я конвертировал некоторые тесты Mocha в Jest, и before() Mocha выдавал ту же ошибку:

Обратный вызов «describe» не должен возвращать значение. Возврат значения из «describe» не пройдет тест в будущей версии Jest.

Трассировка стека указывала на то, что виновником является describe(), но исправление заключалось в преобразовании вложенных вызовов before() в Jest-совместимый beforeAll(). Здесь может быть проблема, связанная с попыткой использовать it() вместо test(), но это может быть запутанным, в тестовой среде Jest определенно есть it().

person worc    schedule 27.03.2019

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

logger.info1111.mockImplementation((m, d) => console.info(m, d));
person Yury Kozlov    schedule 06.04.2019