Memata-matai fungsi node.js yang tidak diekspor menggunakan lelucon tidak berfungsi seperti yang diharapkan

Saya mencoba meniru fungsi yang tidak diekspor melalui 'jest' dan 're-wire'.

Di sini saya mencoba mengejek 'iAmBatman' (tidak ada maksud kata-kata) tetapi tidak diekspor.

Jadi saya menggunakan rewire, yang berfungsi dengan baik. Tapi jest.mock tidak berfungsi seperti yang diharapkan.

Apakah saya melewatkan sesuatu di sini atau Apakah ada cara mudah untuk mencapai hal yang sama?

Pesan kesalahan yang diberikan oleh jest adalah:

Cannot spy the property because it is not a function; undefined given instead

service.js

function iAmBatman() {
    return "Its not who I am underneath";
}

function makeACall() {
    service.someServiceCall(req => {
        iAmBatman();
    });
    return "response";
}

module.export = {
    makeACall : makeACall;
}

jest.js

const services = require('./service');
const rewire = require('rewire');
const app = rewire('./service');
const generateDeepVoice = app.__get__('iAmBatman'); 

const mockDeepVoice = jest.spyOn(services, generateDeepVoice);

mockDeepVoice.mockImplementation(_ => {
    return "But what I do that defines me";
});

describe(`....', () => {
    test('....', done => {
        services.makeACall(response, () => {

        });
    });
})

person Rajkumar Somasundaram    schedule 04.06.2019    source sumber


Jawaban (1)


Tidak sepenuhnya jelas apa tujuan Anda, tetapi jika Anda melihat dokumentasi jest.spyOn, Anda melihat bahwa dibutuhkan methodName sebagai argumen kedua, bukan metode itu sendiri:

jest.spyOn(object, methodName)

Ini menjelaskan kesalahan Anda: Anda tidak memberikan nama fungsi, tetapi fungsi itu sendiri. Dalam hal ini, penggunaan jest.spyOn(services, 'iAmBatman') tidak akan berhasil, karena iAmBatman tidak diekspor, dan oleh karena itu services.iAmBatman tidak ditentukan.

Untungnya, Anda tidak memerlukan spyOn, karena Anda cukup membuat fungsi tiruan baru, lalu menyuntikkannya dengan __set__ rewire sebagai berikut:

(perhatikan bahwa saya menghapus service.someServiceCall yang tidak ditentukan di file pertama Anda, dan memperbaiki beberapa kesalahan ketik dan impor yang berlebihan)

// service.js

function iAmBatman() {
    return "Its not who I am underneath";
}

function makeACall() {
    return iAmBatman();
}

module.exports = {
    makeACall: makeACall
}
// service.test.js

const rewire = require('rewire');
const service = rewire('./service.js');

const mockDeepVoice = jest.fn(() => "But what I do that defines me")
service.__set__('iAmBatman', mockDeepVoice)

describe('service.js', () => {
    test('makeACall should call iAmBatman', () => {
        service.makeACall();
        expect(mockDeepVoice).toHaveBeenCalled();
    });
})

Pilihan lain adalah merestrukturisasi kode Anda dengan iAmBatman dalam modul terpisah, dan kemudian meniru impor modul dengan Jest. Lihat dokumentasi jest.mock.

person Rens Baardman    schedule 05.06.2019