Подглядывание за неэкспортированной функцией node.js с использованием jest, работающего не так, как ожидалось - PullRequest
3 голосов
/ 04 июня 2019

Я пытаюсь смоделировать неэкспортированную функцию с помощью jest и re-wire.

Здесь я пытаюсь смоделировать iAmBatman (не предназначенный для каламбура), но это не так.экспортировано.

Так что я использую rewire, который хорошо работает.Но jest.mock не работает должным образом.

Я что-то здесь упускаю или есть простой способ добиться того же?

Сообщение об ошибке, выдаваемое Jest:

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, () => {

        });
    });
})

1 Ответ

0 голосов
/ 05 июня 2019

Не совсем ясно, какова ваша цель, но если вы посмотрите на документацию jest.spyOn , вы увидите, что в качестве второго аргумента принимается methodName, а не сам метод:

jest.spyOn(object, methodName)

Это объясняет вашу ошибку: вы не дали функции имя , а саму функцию.В этом случае использование jest.spyOn(services, 'iAmBatman') не сработает, поскольку iAmBatman не экспортируется и, следовательно, services.iAmBatman не определено.

К счастью, вам не нужен spyOn, так как вы можетепросто создайте новую фиктивную функцию, а затем вставьте ее с помощью __set__ rewire следующим образом:

(обратите внимание, что я удалил неопределенный service.someServiceCall в вашем первом файле и исправил некоторые опечатки и избыточный импорт)

// 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();
    });
})

Другой вариант - изменить код с помощью iAmBatman в отдельном модуле, а затем смоделировать импорт модуля с помощью Jest.См. документацию jest.mock.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...