Вы видите ошибку, потому что вы звоните mockImplentation
вместо mockImplementation
. К сожалению, когда вы исправите эту опечатку, тест все равно не пройдет.
Это потому, что вы вызываете метод promisify
для exec
, что позволяет использовать его в качестве обещания. promisify
делает под капотом преобразование из функции на основе асинхронного обратного вызова (где обратный вызов помещается в последний параметр и вызывается с ошибкой в качестве первого параметра, а данные в качестве второго) в функцию на основе обещания.
Итак, чтобы метод promisify
работал, вам нужно смоделировать метод exec
, чтобы он вызывал параметр обратного вызова для разрешения обещания.
Также обратите внимание, что вы читаете параметр stdout
из результата вызова exec
, поэтому в возвращаемых данных вам нужно будет отправить объект с этим свойством.
Принимая во внимание все это:
it('check upstream repo', async () => {
child_process.exec.mockImplementation((command, callback) => {
callback(null, { stdout: 'git@github.com:mock/url.git' });
});
await expect(serverScript.getUpstreamRepo()).
resolves.toEqual('mock/url.git');
});
Другое возможное решение состоит в том, чтобы напрямую высмеивать метод promisify
:
jest.mock('util', () => ({
promisify: jest.fn(() => {
return jest.fn().mockResolvedValue({ stdout: 'git@github.com:mock/url.git' });
})
}));
describe('Test Class', () => {
it('check upstream repo', async () => {
await expect(serverScript.getUpstreamRepo()).
resolves.toEqual('mock/url.git');
});
});