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?
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:
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.
Komentar yang paling membantu
Jest mengatur ulang registri modul pada setiap panggilan ke
it
. Anda membutuhkanApiWrapper
di atas danHelper
di dalam beforeEach, jadi Helper kemungkinan menerima salinanApiWrapper
. Untuk memperbaikinya Anda dapat:beforeEach
Penjelasan yang disederhanakan:
Beri tahu saya jika itu tidak menyelesaikan masalah Anda.