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
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!
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
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/
Please log in to upload a file.
There are no updates yet.
Click the Upload button above to add an update.