Ожидалось, что будет вызвано одно утверждение, но получено ноль вызовов утверждений

Я пытаюсь протестировать метод с помощью Jest ... Метод должен возвращать Promise.reject ().

Вот код, который я написал:

test('testing Invalid Response Type', () => {       
        const client = new DataClient();

        client.getSomeData().then(response => {
            console.log("We got data: "+ response);
        }).catch(e => {
            console.log("in catch");
            expect(e).toBeInstanceOf(IncorrectResponseTypeError);

        });
        expect.assertions(1);

  });

Когда я запускаю тест, он выводит сообщение «в перехвате», но не с этим исключением: Ожидалось, что будет вызвано одно утверждение, но не было получено никаких вызовов утверждений.

console.log src/data/dataclient.test.js:25
      in catch

  ● testing Invalid Response Type

    expect.assertions(1)

    Expected one assertion to be called but received zero assertion calls.

      at extractExpectedAssertionsErrors (node_modules/expect/build/extract_expected_assertions_errors.js:37:19)
          at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:188:7)

person ALBI    schedule 16.09.2017    source источник
comment
Похоже, у вас нет совпадения errorType. (Вы поймали ошибку, но она не была типа IncorrectResponseTypeError)   -  person James Maa    schedule 16.09.2017
comment
Может быть, вы можете попробовать записать e в свою консоль, чтобы узнать, что это за тип на самом деле   -  person Josh Beam    schedule 16.09.2017


Ответы (2)


Я решил это, добавив оператор return перед блоком. С оператором return функция будет ждать завершения блока catch .. и, следовательно, будет выполнено ожидание ..

test('testing Invalid Response Type', () => {       
    const client = new DataClient();
    return client.getSomeData().then(response => {
            console.log("We got data: "+ response);
        }).catch(e => {
            console.log("in catch");
            expect(e).toBeInstanceOf(IncorrectResponseTypeError);

        });
        expect.assertions(1);
   });
person ALBI    schedule 16.09.2017
comment
что, если вы используете async / await? - person ckim16; 01.04.2019
comment
Вы возвращаетесь до того, как expect.assertions(1); будет запущен. - person Phil D.; 27.09.2020
comment
@ ckim16 увидеть мой ответ, нет причин не - person noam7700; 03.10.2020

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

см. руководство по асинхронному использованию jest, особенно решение async / await. Собственно, их пример практически идентичен вашей проблеме.

в вашем примере вы бы сделали:

test('testing Invalid Response Type', async () => { // <-- making your test async!      
    const client = new DataClient();

    await client.getSomeData().then(response => { // <-- await for your function to finish
        console.log("We got data: "+ response);
    }).catch(e => {
        console.log("in catch");
        expect(e).toBeInstanceOf(IncorrectResponseTypeError);

    });
    expect.assertions(1);

});

Кстати, принятое решение также работает, но не подходит для нескольких тестов асинхронного кода

person noam7700    schedule 27.09.2020