Saya memiliki fungsi sederhana yang menggunakan player dan memanggil fungsi bersarang setPlayer() di atasnya:

myFunction = (player) => {
    player.getData().setPlayer(true)
}

main.test.js

it('expects setPlayer to be called', () => {

    player = jest.fn();

    // mocking the myFunction 

    player.getData = jest.fn(() => {
      return {
        setPlayer: jest.fn().mockReturnValue(true),
      }
    })

    myFunction(player) // calling function

    expects(player.getData.setPlayer).toBeCalled();
});

Saya terus mendapatkan kesalahan ini dalam pengujian saya, tetapi saya tidak mengerti mengapa. Sepertinya saya memiliki semuanya yang diejek kecuali saya melupakan sesuatu:

expect(received).toBeCalled()

Matcher error: received value must be a mock or spy function

Received has value: undefined
1
HarLinton 13 Mei 2021, 17:32

1 menjawab

Jawaban Terbaik

Saya terus mendapatkan kesalahan ini dalam pengujian saya, tetapi saya tidak mengerti mengapa.

player.getData adalah fungsi tiruan. Fungsi tersebut tidak memiliki properti setPlayer. Anda meneruskan undefined ke expects, oleh karena itu kesalahannya.

Memanggil player.getData akan mengembalikan Anda sebuah objek dengan fungsi setPlayer, tetapi Anda tidak bisa hanya melakukan expects(player.getData().setPlayer) karena itu akan mengembalikan berbeda setPlayer fungsi tiruan daripada yang dipanggil oleh myFunction.

Sebagai gantinya, Anda cukup membuat fungsi tiruan setPlayer di depan dan merujuknya secara langsung. Saya juga membersihkan kode sedikit.

it('expects setPlayer to be called', () => {

    const setPlayerMock = jest.fn().mockReturnValue(true);
    const player = {
      getData: jest.fn(() => {
        return {
          setPlayer: setPlayerMock,
        };
      }),
    };

    myFunction(player); // calling function

    expects(setPlayerMock).toBeCalled();
});

FWIW, dengan informasi yang Anda berikan, tidak perlu menggunakan fungsi tiruan untuk getData, Anda bisa melakukannya

const player = {
  getData() {
    return {setPlayer: setPlayerMock};
  },
}

Anda hanya perlu menggunakan fungsi tiruan saat Anda ingin membuat pernyataan tentangnya.

0
Felix Kling 13 Mei 2021, 19:48