与开玩笑的嘲笑接口
#typescript #node #tdd #tests

目标

如果您厌倦了移动混凝土类,创建类或使用模拟的功能,以下这两个功能将以非常聪明和实用的方式帮助您。

situaã§o

我们需要测试将返回常规列表的服务。

系统流

flowsystem

睾丸

很多次,我们创建了某种责任/对象来模拟取决于将“合同”注入到一种服务中的“合同”。当我们使用隔离界面原理时,我们可以使用两个数据包特征 开玩笑 直接模拟接口 ,而不必担心外部依赖(ex) :混凝土重新定位)

例子

在这里,我们有一个重新定位的接口。

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

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

在我们的服务中,我们将根据此界面进行注入(不说谁是代表这一点的具体类,依赖性倒数)。

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
    }
}

现在在测试中,母亲=)

请注意,在差异中,我们正在使用 Mockproxy no 接口,而不是在混凝土类中,在我们正在谈论的测试中模拟。

这样,我们并不关心具体的重新定位类别,仅与需要测试的服务层有关。

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)
    })
})

谢谢!

参考:Manguinho

cã°t:abiaoqian