Rumah >hujung hadapan web >tutorial js >Bagaimana untuk Mengejek Fungsi Dengan Berkesan Dalam Modul Yang Sama Menggunakan Jest?

Bagaimana untuk Mengejek Fungsi Dengan Berkesan Dalam Modul Yang Sama Menggunakan Jest?

DDD
DDDasal
2024-12-16 02:25:14955semak imbas

How to Effectively Mock Functions Within the Same Module Using Jest?

Fungsi Mengejek dalam Modul Yang Sama Menggunakan Jest

Apabila fungsi mengejek dalam modul yang sama, adalah penting untuk memahami batasan ejekan lalai Jest mekanisme.

Masalah:

Mengimport modul dan secara langsung mengejek fungsi eksportnya, seperti dalam contoh di bawah, boleh membawa kepada tingkah laku yang tidak dijangka.

// module.js
export function bar() { return 'bar'; }
export function foo() { return `I am foo. bar is ${bar()}`; }

// module.test.js
import * as module from '../src/module';

describe('module', () => {
  let barSpy;

  beforeEach(() => {
    barSpy = jest.spyOn(module, 'bar').mockImplementation(jest.fn());
  });

  it('foo', () => {
    module.bar.mockReturnValue('fake bar');
    expect(module.foo()).toEqual('I am foo. bar is fake bar');
    // Fails: Expected "I am foo. bar is fake bar" but received "I am foo. bar is bar"
  });
});

Penjelasan:

Dalam contoh di atas, foo membuat panggilan terus ke fungsi bar asal semasa masa import. Walaupun barSpy dikemas kini dengan betul semasa persediaan ujian, foo masih merujuk kepada fungsi bar yang tidak dipermainkan, mengakibatkan output yang salah.

Penyelesaian 1:

Import Modul ke dalam Fail Kod Sendiri:

Untuk mengelakkan isu ini, modul boleh diimport ke dalam fail kodnya sendiri, memastikan bahawa semua entiti yang dieksport diimport dari tika yang sama.

// module.js
export function bar() { return 'bar'; }
export function foo() { return `I am foo. bar is ${thisModule.bar()}`; }

// module.test.js
import * as module from './module';

describe('module', () => {
  it('foo', () => {
    spyOn(module, 'bar').and.returnValue('fake bar');
    expect(module.foo()).toEqual('I am foo. bar is fake bar');
  });
});

Dalam contoh yang diubah suai ini, foo kini mengakses bar melalui modul.bar contoh yang diimport, membolehkan mudah mengejek .

Penyelesaian 2:

Olok-olok Import Secara Manual:

Sebagai alternatif, import boleh dipermainkan secara manual dalam persediaan ujian, mencipta contoh baharu modul yang diasingkan daripada versi yang tidak dipermainkan.

// module.test.js
jest.mock('../src/module');
const * as mockedModule = require('../src/module');

describe('module', () => {
  beforeEach(() => {
    mockedModule.bar.mockImplementation(jest.fn());
  });

  it('foo', () => {
    mockedModule.bar.mockReturnValue('fake bar');
    expect(mockedModule.foo()).toEqual('I am foo. bar is fake bar');
  });
});

Dalam pendekatan ini, contoh yang diejek mockedModule digunakan untuk menguji, menghalang gangguan daripada import yang tidak dipermainkan.

Atas ialah kandungan terperinci Bagaimana untuk Mengejek Fungsi Dengan Berkesan Dalam Modul Yang Sama Menggunakan Jest?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn