Jest: Mengejek metode kelas statis

Dibuat pada 5 Jul 2016  ·  3Komentar  ·  Sumber: facebook/jest

Saya mengalami masalah saat mencoba mengejek metode kelas statis di Jest. Apakah perilaku ini didukung?

Diposting silang di http://stackoverflow.com/questions/38206478/mocking-methods-in-jest

Saya memiliki unit test yang sangat sederhana yang terlihat seperti ini:

import ApiWrapper from '../../services/api_wrapper';
jest.unmock('../helper')

describe('Helper', () => {
    let Helper;

    beforeEach(() => {
        Helper = require('../helper').default;
    });

    it('calls the Api Wrapper', () => {
        Helper.help()

        expect(ApiWrapper.help).toHaveBeenCalled();
    });

});

Di mana Pembantu terlihat seperti ini:

import ApiWrapper from '../services/api_wrapper'
class Helper {
    help() {
        ApiWrapper.help()
    }
}

export default new Helper();

Dan ApiWrapper terlihat seperti ini:

class ApiWrapper {
  static help () {
     console.log('help!')
  }
}
export default ApiWrapper;

ApiWrapper.help() diejek oleh Jest jadi 'tolong!' tidak pernah dicetak, namun harapan dalam tes gagal. Ini masih gagal jika kita menulis ulang ApiWrapper menjadi objek Javascript biasa seperti:

export default {
    help: () => { console.log('help!'); }
}

Namun, ini berfungsi jika kita mengubah impor dalam spesifikasi (jadi ApiWrapper diimpor di beforeEach), dan menulis ulang ApiWrapper menjadi kelas Singleton, seperti:

class ApiWrapper {
   help() {
      console.log('help!');
   }
}();

export default new ApiWrapper();

Ada apa dengan perilaku mengejek Jest yang membuat ini terjadi?

Komentar yang paling membantu

Jest mengatur ulang registri modul pada setiap panggilan ke it . Anda membutuhkan ApiWrapper di atas dan Helper di dalam beforeEach, jadi Helper kemungkinan menerima salinan ApiWrapper . Untuk memperbaikinya Anda dapat:

  • Impor kedua kelas di atas.
  • Wajibkan kedua kelas di beforeEach

Penjelasan yang disederhanakan:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

Beri tahu saya jika itu tidak menyelesaikan masalah Anda.

Semua 3 komentar

Pernyataan yang benar harus toBeCalled . Bisakah kamu mencobanya?

Maaf, itu yang saya maksud. Saya mengetikkan contoh di Stackoverflow secara langsung.

Jest mengatur ulang registri modul pada setiap panggilan ke it . Anda membutuhkan ApiWrapper di atas dan Helper di dalam beforeEach, jadi Helper kemungkinan menerima salinan ApiWrapper . Untuk memperbaikinya Anda dapat:

  • Impor kedua kelas di atas.
  • Wajibkan kedua kelas di beforeEach

Penjelasan yang disederhanakan:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

Beri tahu saya jika itu tidak menyelesaikan masalah Anda.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat