Mocking Interface with jest-mock-extended

Objetivo

Se você está cansado de mockar classes concretas, criar classes ou funções para usar de mock, essas duas funções abaixo vão te ajudar de uma maneira bem inteligente e prática.

Situação

Precisamos testar um serviço que va…


This content originally appeared on DEV Community 👩‍💻👨‍💻 and was authored by Gabriel Valin

Objetivo

Se você está cansado de mockar classes concretas, criar classes ou funções para usar de mock, essas duas funções abaixo vão te ajudar de uma maneira bem inteligente e prática.

Situação

Precisamos testar um serviço que vai nos retornar uma lista de usuários.

Fluxo do sistema

flowsystem

Testes

Muitas das vezes, criamos algum tipo de módulo/objeto para mockar dependências que seguem um "contrato" que são injetadas em um tipo de serviço. Quando usamos o princípio de Interface Segregation podemos mockar diretamente a INTERFACE usando duas funcionalidades do pacote jest-mock-extended sem se preocupar com as dependências externas (ex: Repositórios concretos)

Exemplo

Aqui temos uma interface que um repositório deve seguir.

import { UserDTO } from "../dtos/user";

export interface GetUsers {
    allUsers(): Promise<UserDTO[]>
}

E no nosso serviço vamos ter uma injeção de dependência seguindo essa interface (sem dizer quem é a classe concreta que representa isso, Inversão de Dependência).

import { UserDTO } from "../dtos/user";
import { ServiceProtocol } from "../protocols/service";
import { GetUsers } from "../repos/get-users";

export default class GetAllUsersService implements ServiceProtocol<null, Promise<UserDTO[]>> {
    constructor (private readonly usersRepository: GetUsers) {}

    async perform(): Promise<UserDTO[]> {
        const all = await this.usersRepository.allUsers()
        return all
    }
}

Agora nos testes, a mágica =)

Repare que na variável usersRepository estamos utilizando o MockProxy na interface e não na classe concreta e entre os testes estamos falando para que a mesma seja mockada.

Com isso, não se preocupamos com classe concreta de repositório, apenas com a camada do serviço que precisa ser testada.

import GetAllUsersService from "@/domain/services/get-all-users-service"
import { mock, MockProxy } from 'jest-mock-extended'
import { GetUsers } from "./repos/get-users"

describe('GetAllUsersService', () => {
    let sut: GetAllUsersService
    let usersRepository: MockProxy<GetUsers>

    beforeAll(() => {
       usersRepository = mock()
    })

    beforeEach(() => {
        sut = new GetAllUsersService(usersRepository)
        usersRepository.allUsers.mockResolvedValue([
            {
                name: 'user 1',
                email: 'user 1',
                age: 'user 1',
                departament: 'user 1',
                created_at: new Date(),
                inative: false
            },
        ])
    })

    it('should call allUsers one time', async () => {
        await sut.perform()

        expect(usersRepository.allUsers).toHaveBeenCalledTimes(1)
    })
})

Valeu!

Referências: Manguinho

CÓDIGO-FONTE: https://github.com/Gabriel-Valin/clean-arch-express-based


This content originally appeared on DEV Community 👩‍💻👨‍💻 and was authored by Gabriel Valin


Print Share Comment Cite Upload Translate Updates
APA

Gabriel Valin | Sciencx (2022-11-03T15:27:16+00:00) Mocking Interface with jest-mock-extended. Retrieved from https://www.scien.cx/2022/11/03/mocking-interface-with-jest-mock-extended/

MLA
" » Mocking Interface with jest-mock-extended." Gabriel Valin | Sciencx - Thursday November 3, 2022, https://www.scien.cx/2022/11/03/mocking-interface-with-jest-mock-extended/
HARVARD
Gabriel Valin | Sciencx Thursday November 3, 2022 » Mocking Interface with jest-mock-extended., viewed ,<https://www.scien.cx/2022/11/03/mocking-interface-with-jest-mock-extended/>
VANCOUVER
Gabriel Valin | Sciencx - » Mocking Interface with jest-mock-extended. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2022/11/03/mocking-interface-with-jest-mock-extended/
CHICAGO
" » Mocking Interface with jest-mock-extended." Gabriel Valin | Sciencx - Accessed . https://www.scien.cx/2022/11/03/mocking-interface-with-jest-mock-extended/
IEEE
" » Mocking Interface with jest-mock-extended." Gabriel Valin | Sciencx [Online]. Available: https://www.scien.cx/2022/11/03/mocking-interface-with-jest-mock-extended/. [Accessed: ]
rf:citation
» Mocking Interface with jest-mock-extended | Gabriel Valin | Sciencx | https://www.scien.cx/2022/11/03/mocking-interface-with-jest-mock-extended/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.