Перемешанная функция jest.fn () не была вызвана во второй раз - PullRequest
0 голосов
/ 21 июня 2019

Я тестирую одну из функций нашего проекта и столкнулся со странной проблемой. У меня нет идей, как решить эту проблему.

jest -v
24.8.0
node -v
v10.14.2
    const action = (fn1, fn2) => {
        fn1('fn1 call 1');

        return fn2('fn2 call 1')
            .then(() => {
                fn1('fn1 call 2');
                console.log('then was called');
            });
    };

    describe('test case', () => {
        it('should pass', () => {
            const fn1 = jest.fn();
            const fn2 = jest.fn()
                .mockResolvedValue(Promise.resolve('test'));

            action(fn1, fn2);

            expect(fn2).toBeCalledWith('fn2 call 1');
            expect(fn1).nthCalledWith(1,'fn1 call 1');
            expect(fn1).nthCalledWith(2,'fn1 call 2');
        })
    });

Выход:

  ● test case › should pass

    expect(jest.fn()).nthCalledWith(expected)

    Expected mock function second call to have been called with:
      ["fn1 call 2"]
    But it was not called.

      19 |             expect(fn2).toBeCalledWith('fn2 call 1');
      20 |             expect(fn1).nthCalledWith(1,'fn1 call 1');
    > 21 |             expect(fn1).nthCalledWith(2,'fn1 call 2');
         |                         ^
      22 |         })
      23 |     });
      24 | 

      at Object.nthCalledWith (test.js:21:25)

  console.log test.js:7
    then was called

Если я заменю fn1 на: (args) => console.log(args)

Я получаю это:

  console.log test.js:13
    fn1 call 1

  console.log test.js:13
    fn1 call 2

  console.log test.js:7
    then was called

Так что, возможно, есть какая-то ошибка при использовании jest.fn() Может ли кто-нибудь помочь мне с этой проблемой?

1 Ответ

1 голос
/ 21 июня 2019

Причина, по которой вы получаете эту ошибку, заключается в том, что action возвращает обещание, а вы не ожидаете результата этого обещания;когда fn1 вызывается во второй раз, когда ваш тест не пройден из-за этой строки expect(fn1).nthCalledWith(2, 'fn1 call 2'), следовательно, вы видите ошибку.Кроме того, вызов Promise.resolve('test') в jest.fn().mockResolvedValue(); является избыточным , см. Документ

. Чтобы исправить это, вам нужно дождаться результата action:

describe('test case', () => {
  it('should pass', async () => {
    const fn1 = jest.fn();
    const fn2 = jest.fn()
      .mockResolvedValue('test');

    await action(fn1, fn2);

    expect(fn2)
      .toBeCalledWith('fn2 call 1');
    expect(fn1)
      .nthCalledWith(1, 'fn1 call 1');
    expect(fn1)
      .nthCalledWith(2, 'fn1 call 2');
  });
});

Другой подход:

describe('test case', () => {
  it('should pass', (done) => {
    const fn1 = jest.fn();
    const fn2 = jest.fn()
      .mockResolvedValue(Promise.resolve('test'));

    action(fn1, fn2)
      .then(() => {
        expect(fn2)
          .toBeCalledWith('fn2 call 1');
        expect(fn1)
          .nthCalledWith(1, 'fn1 call 1');
        expect(fn1)
          .nthCalledWith(2, 'fn1 call 2');
        done();
      });
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...