Um júnior e um teste técnico:战斗。
目录
提议的目标
齿状铁
最初几个世纪
建筑与项目
错误治疗
睾丸
杜维达
问卷调查
结论
Alguns dias me deparei com um teste técnico and decidi fazer mesmo após já ter Finalizado o entrega, não sei bem para que nível foi passado o o teste, mas acredito que foi usado em diffentes níveis, o que vai definir a Complexidade do projeto é候选人的一个解决方案,无论是哪一个,都决定如何申请或寻求机会。
如果你想测试技术,你可以尝试技术,可以假装明确的解决方案、动机、反应和观点。
目录
提议的目标
Em resumo, o desafio é fazer uma API, um sistema de banco simplificado, nessa API exite dois Tipos de usuário, o comum eo lojista, o comum pode Transferir dinheiro para o lojista ou outro usuário comum, já o lojista não pode fazer transferência, ele apenas receber, veja mais alguns 要求:
- 确认转移前的使用情况。
- 转让的最终确定、外部服务授权的开发咨询、以及
mock
模拟服务的分配。 - A operação de moveência deve ser uma transação (ou seja, revertida em qualquer caso de inconsistência) eo dinheiro deve voltar para a carteira do usuário que envia.
- 没有接收到的页面,请注意接收通知(电子邮件、短信),以提供第三次服务和最终的服务。 Para isso também foi disponibilizado um
mock
para simular o envio。
Mock
: 是模仿的对象或真实组件的组合。使用独立测试软件和外部依赖测试软件,确保测试速度更快并预先提供。
暂无可用的测试技术:
- 乌苏亚里奥斯和洛吉斯塔的地籍流动
- 认证
您必须了解使用情况的说明、使用 JWT 的验证以及所需的各种现有策略、express-validator
中间件或中间件的使用class-validator
情况decorators
,以及控制器或控制器的验证情况 中间件。
齿状铁
Para começar com chave de ouro nesse teste técnico, nada mais, nada menos do que o amigo da galera, sim, ele mesmo, nosso tão amado Javascript
, na verdade, vou usar o Typescript
junto ao Express
. Como é 是一种语言,是一种语言,是一个有问题的项目,我允许专注于建筑和设计。作为 ferramentas que usei foram:
最初几个世纪
Acredito que não 存在 uma ordem perfeita para se começar um projeto, já me deparei com pessoas começando pelas rotas, criando estrutura de papas primeiro que tudo, outras criando os testes para depois Implementar as funcionalidades, sendo essa ultima talvez a mais famosa e mais indicada que访问互联网、进入其他地方、enfim、não sei qual é melhor、após instalar as ferramentas escolhidas e tripagem comecei a desenvolver a tabela do banco。
我承认自己的模型并不强大,但它是最简单的方法。
BEGIN;
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
firstName VARCHAR(255) NOT NULL,
lastName VARCHAR(255) NOT NULL,
document VARCHAR(14) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
balance INT,
userType VARCHAR(7) NOT NULL
);
CREATE TABLE IF NOT EXISTS transactions (
id SERIAL PRIMARY KEY,
payer INT NOT NULL,
payee INT NOT NULL,
amount INT NOT NULL,
date_transaction TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (payer) REFERENCES users(id),
FOREIGN KEY (payee) REFERENCES users(id)
);
COMMIT;
屏幕前,大家都知道应用程序types
存在的问题。
type User = {
id?: number;
firstName: string;
lastName: string;
document: string;
password: string;
email: string;
balance: number;
usertype: "comum" | "lojista";
};
type Transaction = {
id?: number;
amount: number;
payer: number;
payee: number;
date_transaction?: Date;
}
对于朋友和朋友来说,如果你想了解更多关于模型的信息,请联系我们:
-
为保护我们的货物,请想象一下,在我们的货物中存在着大量的货物,在我们的货物中,
user
货物是在货物之外的,并且与我们的关系有关,结果是我们正常化了。 -
除了与客户联系的萨尔瓦里亚表格外,我们还没有为您的服务提供额外的表格。
建筑与项目
Acabei optando por utilizar uma arquitetura em camadas。我们的动机是:
- 解決代碼。
- 责任分离。
- 模块化和重新利用代码。
- 方便睾丸的时间。
Não posso deixar de citar os pontos negativos:
- 附加复杂。
- 实施项目时遇到困难。
不过,我们知道东方原理是一个物体、模拟、或常见的 SOLID。没有什么可改变的原则:
Responsabilidade única
示例是通过存储库和常用程序进行通信的后续方法 id:
async userById(id: number) {
const user = await this.userRepository.userById(id);
if (!user) {
throw new InvalidUser("Usuario invalido");
}
return user;
}
Inversão da dependência
eaberto-fechado
: 使用一个接口来作为 banco de bados 的抽象,但可以使用它来精确地定义UserService
banco minha 应用程序的接口:
//abstração
export interface IUserRepository {
newUser(user: User): Promise<User>;
userById(id: number): Promise<User>;
emailExist(email: string): Promise<boolean>;
documentExist(document: string): Promise<boolean>;
}
export class UserService {
constructor(private userRepository: IUserRepository) {}
async newUser(user: User) {
const EmailExist = await this.userRepository.emailExist(user.email);
if (!EmailExist) {
throw new InvalidEmail("Email invalido");
}
const DocumentExist = await this.userRepository.documentExist(
user.document
);
if (!DocumentExist) {
throw new InvalidDocument("Document invalid");
}
const newUser = await this.userRepository.newUser(user);
return newUser;
}
//...
}
我的意思是,我的代码是多变的,所以我们需要进行大量的抽象,或者使用过多的代码。
在结束语/后明确的 SOLID 中,我们看到了 SOLID 的例子,并通过图像来了解 SOLID 的原理:SOLID 时代是我的福尔塔瓦 (Era SOLID)。项目组织部分的集市,您可以详细了解卡达卡马达的功能,或者项目的具体项目,请注意:
Repository
: camada responsável por interagir com o banco de bados。Service
: camada onde a lógica de negócio acontece, interações com outros serviços and manipulação dos godos envirados/recebidos dorepository
.Controller
: 收集客户所需资料,验证验证信息,验证所接收的信息和环境,并提供不同的服务。
错误治疗
Javascript
在执行代码期间,不要使用激光雷达来执行try catch
此操作,而是要重复执行代码,以实现不同的返回方式、不同的操作方法和组织结构的功能e muito difícil de se entender。
通常,您可以详细了解语言,选择使用中间件来解决错误,并在图书馆中进行操作,express-async-errors
以实现非控制的最佳效果。
export const errorMiddleware = (
error: Error & Partial<ApiError>,
request: Request,
response: Response,
next: NextFunction
) => {
const statusCode = error.statusCode ?? 500;
const message = error.statusCode ? error.message : "Internal Server Error";
return response.status(statusCode).json({ error: message, code: statusCode });
};
我们使用的中间件可能会超出应用程序的范围,但也不会出现任何错误,但也可能会出现一些错误,并且可能会导致个性化。
export class ApiError extends Error {
public readonly statusCode: number;
constructor(message: string, statusCode: number) {
super(message);
this.statusCode = statusCode;
}
}
// Um dos erros que usei na aplicação
export class UnauthorizedTransaction extends ApiError {
constructor(message: string) {
super(message, 401);
}
}
//Caso de uso.
const isAuthorized = await this.authorizationService.authorizeTransaction();
if (!isAuthorized) {
throw new UnauthorizedTransaction("Transação não autorizada");
}
Em outro artigo/post que fiz falo mais sobre esse assunto do
try-catch
e middleware de erros: Lidando com exceções。
睾丸
Esse projeto me fez melhor muito na maneira que desenvolvo os meus testes ea estrutura escolhida para esse projeto auxiliou muito para isso, mais alguns benefícios que a estrutura do projeto proporcionou:
- 我允许克里尔嘲笑他们的具体情况
- 内存测试数据库
我们对这些用途mocks
的兴趣、我们对它们的了解、我们不知道它的功能、我们与技术的关系、所有这些都与我们的技术有关mock
、我们对这些特殊的东西的信用度很高。测试,例如:
test("authorizeTransaction should return false when authorization is not successful", async () => {
global.fetch = vi.fn().mockResolvedValue({
json: () => Promise.resolve({ message: "Not authorized" }),
});
const result = await authService.authorizeTransaction();
expect(result).toBe(false);
});
本质上是允许测试或返回非控制性算法的示例mock
,不支持交易授权的 API。
test("It should not be possible to create a user with an email that already exists", async () => {
const { fakeUser, userService } = makeSut();
await userService.newUser(fakeUser);
await expect(userService.newUser(fakeUser)).rejects.toThrow(
"Email invalido"
);
});
我们要注意的是In Memory Database
,没有任何链接可以使您受益匪浅,因为您可以将其应用到您的睾丸中,并从您的睾丸中取出睾丸,并使用银行的服务。 bados eu consigo testa de maneiras simples 和 rápida pontos de falhas。
没有测试E2E用于与supertest
容器结合的Docker容器和银行的postgreSQL,在E2E测试中使用的问题是与银行相关的pequeno脚本。
杜维达
主要解决方案是解决方案中的问题和解决方案,并考虑到互联网上的问题,并overengineering
在接下来的一段时间里进行阿尔古玛应用程序的开发。 Tendo isso emmente, eu me Questionei, como que esse overengineering
seria vito pelo entrevistador? Eu estaria mostrando conhecimento ou iria parecer esta copiando ''modelo'' de solução? Provavelmente o que responderia essas perguntas seria minha entrevista。
Overengineering
: 完全可以解决这个复杂的问题,或者是真正精确的问题。 É como usar um canhão para matar uma mosca。这是根据节奏、递归和制作难度得出的结果。总结起来,这个算法可能很复杂,需要解决问题。
问卷调查
最后,我们讨论了He4rt 开发者社区的最终结果,但他们的结果是合法的,但我提出了一个问题,因为我们与美国技术相关,但没有发展过程。您将在本次活动中获得主要的主题,并解决所有必要的问题和信用问题,从而促进阿尔古玛马内拉的发展。
使用或不使用框架?建立一个有助于确定解决问题的框架和解决问题的过程、解决问题的关键框架、解决特定情况和解决特定问题的框架这是解决问题、存在限制和必要条件的参考资料,我们要对技术进行分析。 O mesmo Questionamento vale para linguagens。
Após Levantar esses pontos, queromostrar Questionamentes que normalmente se deve ter antes de escolher uma tecnologia:
- 是否有足够的使用量?
- 企业基础设施的利用有何问题?
- 新的逻辑实现了吗?
- 有资格批评流程吗?
- 理想的回应速度是怎样的?
我想知道你的情况是怎样的吗?如果你经历过更多的事情,那么问题就完全不同了。
结论
如果没有开始,我们就不能再测试之前的技术,那么就可以解决这个问题,并且可以解决这个问题,我觉得我们之间的关系是很不错的,证明我们不存在任何姿势问题项目,mas de qualquer forma eu saí aprendendo algo。
E você leitor, aprendeu algo com esse artigo?温度算法反馈?请注意,该问题已得到解释,请参阅相关内容。 Será que eu iria passar nesse teste? Fica essa dúvida no ar。
作为一个完整的解决方案,您可以从Github或原始存储库中找到它。我不想与Twitter或He4rt 开发者不和谐。
Gostaria de agradecer a @carloseduardodb ea @cherryramatis pela revisão desse conteúdo, Feedbacks and dicas.关于卡洛斯和他的问题,以及他的问题,以及他的问题。
“Eu tentaria fazer uma solução mais da realidade do pessoal de lá para ganhar uns pontinhos. Às vezes, nem é utilizar a mesma linguagem que eles, mas entender os Problemas que eles têm e como eles solucionam hoje.”
Fica aí mais uma dica。
感谢你们在这里。
文章来源:https://dev.to/clintonrocha98/um-junior-e-um-teste-tecnico-the-battle-4c5b