目标
如果您厌倦了移动混凝土类,创建类或使用模拟的功能,以下这两个功能将以非常聪明和实用的方式帮助您。
situaã§o
我们需要测试将返回常规列表的服务。
系统流
睾丸
很多次,我们创建了某种责任/对象来模拟取决于将“合同”注入到一种服务中的“合同”。当我们使用隔离界面原理时,我们可以使用两个数据包特征 开玩笑 直接模拟接口 ,而不必担心外部依赖(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)
})
})
谢谢!
cã°t:abiaoqian