Um júnior e um teste técnico:战斗。目录 目的 初步设计和设计项目 问题分析 问题结论

2025-06-04

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 é候选人的一个解决方案,无论是哪一个,都决定如何申请或寻求机会。

如果你想测试技术,你可以尝试技术,可以假装明确的解决方案、动机、反应和观点。

目录

提议的目标

gatinho em cima de um 笔记本

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 mockpara 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 Typescriptjunto 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;
Enter fullscreen mode Exit fullscreen mode

屏幕前,大家都知道应用程序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;
}
Enter fullscreen mode Exit fullscreen mode

对于朋友和朋友来说,如果你想了解更多关于模型的信息,请联系我们:

  • 为保护我们的货物,请想象一下,在我们的货物中存在着大量的货物,在我们的货物中,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;
  }
Enter fullscreen mode Exit fullscreen mode
  • Inversão da dependênciae aberto-fechado: 使用一个接口来作为 banco de bados 的抽象,但可以使用它来精确地定义UserServicebanco 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;
  }
  //...
}
Enter fullscreen mode Exit fullscreen mode

我的意思是,我的代码是多变的,所以我们需要进行大量的抽象,或者使用过多的代码。

在结束语/后明确的 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 do repository.
  • 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 });
};
Enter fullscreen mode Exit fullscreen mode

我们使用的中间件可能会超出应用程序的范围,但也不会出现任何错误,但也可能会出现一些错误,并且可能会导致个性化。

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");
}
Enter fullscreen mode Exit fullscreen mode

Em outro artigo/post que fiz falo mais sobre esse assunto do try-catche 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);
  });
Enter fullscreen mode Exit fullscreen mode

本质上是允许测试或返回非控制性算法的示例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"
    );
  });
Enter fullscreen mode Exit fullscreen mode

我们要注意的是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 overengineeringseria 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。这是根据节奏、递归和制作难度得出的结果。总结起来,这个算法可能很复杂,需要解决问题。

问卷调查

gatinho digitalando 没有笔记本和 falando que esta Finalizando algo

最后,我们讨论了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.”

@carloseduardodb

Fica aí mais uma dica。

感谢你们在这里。

文章来源:https://dev.to/clintonrocha98/um-junior-e-um-teste-tecnico-the-battle-4c5b
PREV
新的 npm 即将到来
NEXT
如何触发浏览器使用 window.print() 将 HTML 转换为 PDF