Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Como criar interfaces para os mocks utilizando TypeScript?

Olá, se eu fosse passar o código para typescript, como deveria fazer a tipagem dos mocks? Do teste abaixo, por exemplo.

Como faria para aparece as opções do mock, como o "mockImplementation", em "apiLeiloes"?

import apiLeiloes from '../../src/servicos/apiLeiloes';
import { obtemLeilao, obtemLeiloes } from '../../src/repositorio/leilao';

jest.mock('../../src/servicos/apiLeiloes');

const mockLeilao = { 
    id: 1, 
    name: 'Leilão', 
    descricao: 'Descrição do leilão' 
};

const mockLeiloes = [
    mockLeilao,
];

const mockRequisicao = (retorno) => {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve({
                data: retorno,
            });
        }, 100);
    });
}

const mockRequisicaoErro = () => {
    return new Promise((_, reject) => {
        setTimeout(() => {
            reject();
        }, 100);
    });
}

describe('repositorio/leilao', () => {
    beforeEach(() => {
        // Limpa a implementação do mock em cada "it"
        apiLeiloes.get.mockClear();
    });

    describe('obtemLeiloes', () => {
        it('deve retornar uma lista de leilões', async () => {
            apiLeiloes.get.mockImplementation(() => mockRequisicao(mockLeiloes));

            const leiloes = await obtemLeiloes();

            expect(leiloes).toEqual(mockLeiloes);
            expect(apiLeiloes.get).toHaveBeenCalledWith('/leiloes');
            expect(apiLeiloes.get).toHaveBeenCalledTimes(1);
        });

        it('deve retornar uma lista vazia quando a requisição falhar', async () => {
            apiLeiloes.get.mockImplementation(mockRequisicaoErro);

            const leiloes = await obtemLeiloes();

            expect(leiloes).toEqual([]);
            expect(apiLeiloes.get).toHaveBeenCalledWith('/leiloes');
            expect(apiLeiloes.get).toHaveBeenCalledTimes(1);
        });
    });

    describe('obtemLeilao', () => {
        it('deve retornar um leilão', async () => {
            apiLeiloes.get.mockImplementation(() => mockRequisicao(mockLeilao));

            const leilao = await obtemLeilao(1);

            expect(leilao).toEqual(mockLeilao);
            expect(apiLeiloes.get).toHaveBeenCalledWith(`/leiloes/${1}`);
            expect(apiLeiloes.get).toHaveBeenCalledTimes(1);
        });

        it('deve retornar um objeto vazio quando a requisição falhar', async () => {
            apiLeiloes.get.mockImplementation(mockRequisicaoErro);

            const leilao = await obtemLeilao(1);

            expect(leilao).toEqual({});
            expect(apiLeiloes.get).toHaveBeenCalledWith(`/leiloes/${1}`);
            expect(apiLeiloes.get).toHaveBeenCalledTimes(1);
        });
    });
});
1 resposta
solução!

Depois de alguns dias pesquisando na internet, descobri uma maneira de fazer a tipagem com o TypeScript, é preciso estender a tipagem de mock do jest e guardar em uma nova constante:

import apiLeiloes from '../../src/servicos/apiLeiloes';
...
jest.mock('../../src/servicos/apiLeiloes');

const mockApiLeiloes = apiLeiloes as jest.Mocked<typeof apiLeiloes>;
...

E quando for necessário chamar as funcionalidades do mock, basta usar a constante criada, "mockApiLeiloes":

...
describe('repositorio/leilao', () => {
    beforeEach(() => {
        // Limpa a implementação do mock em cada "it"
        mockApiLeiloes.get.mockClear();
    });

    describe('obtemLeiloes', () => {
        it('deve retornar uma lista de leilões', async () => {
            mockApiLeiloes.get.mockImplementation(() => mockRequisicao(mockLeiloes));
            ...
        });

       ...
    });
    ...
});