{"id":15714510,"url":"https://github.com/wesleysbmartins/node_test","last_synced_at":"2026-05-07T06:37:26.972Z","repository":{"id":252474220,"uuid":"840512618","full_name":"wesleysbmartins/node_test","owner":"wesleysbmartins","description":"Jest é um framework de teste unitário de código aberto em JavaScript criado pelo Facebook a partir do framework Jasmine. Jest é uma das ferramentas de teste unitário mais difundidas dentro da comunidade de JavaScript. Aqui vamos explorá-lo usando uma aplicação Node em Typescipt.","archived":false,"fork":false,"pushed_at":"2024-08-10T00:51:49.000Z","size":37,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-05T22:37:35.287Z","etag":null,"topics":["jest","nodejs","npm","test","typescript","unit-testing"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wesleysbmartins.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-09T22:11:06.000Z","updated_at":"2024-08-10T00:54:48.000Z","dependencies_parsed_at":"2024-08-10T02:46:46.525Z","dependency_job_id":"d159fb71-d27a-4603-91dc-242307884f71","html_url":"https://github.com/wesleysbmartins/node_test","commit_stats":null,"previous_names":["wesleysbmartins/node_test"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wesleysbmartins%2Fnode_test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wesleysbmartins%2Fnode_test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wesleysbmartins%2Fnode_test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wesleysbmartins%2Fnode_test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wesleysbmartins","download_url":"https://codeload.github.com/wesleysbmartins/node_test/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246372503,"owners_count":20766626,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["jest","nodejs","npm","test","typescript","unit-testing"],"created_at":"2024-10-03T21:37:46.813Z","updated_at":"2026-05-07T06:37:21.938Z","avatar_url":"https://github.com/wesleysbmartins.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NodeJs Jest\n[![My Skills](https://skillicons.dev/icons?i=typescript,npm,nodejs,jest)](https://skillicons.dev)\n\nJest é um framework de teste unitário de código aberto em JavaScript criado pelo Facebook a partir do framework Jasmine. Jest é uma das ferramentas de teste unitário mais difundidas dentro da comunidade de JavaScript. Aqui vamos explorá-lo usando uma aplicação Node em Typescipt.\n\n## Iniciando aplicação Node Typescript\nNeste momento é necessário que tenha o NodeJs e o Typescript instaldois e seu ambiente.\n\nAbra seu terminal em sua pasta de projetos, crie o diretório para a aplicação:\n```shell\n$ mkdir node-jest-example\n```\nAcesse a pasta:\n```shell\n$ cd node-jest-example\n```\nVamos iniciar uma aplicação Typescript:\n```shell\n$ npm init -y\n```\n### Instalando e configurando o Jest\nInstale as dependências do **Jest** em sua aplicação em modo de desenvolvimento:\n```shell\n$ npm install jest ts-jest @types/jest -D \n```\nCrie um arquivo **jest.config.js** na raiz do seu projeto:\n```js\nmodule.exports = {\n    preset: 'ts-jest',\n    testEnvironment: 'node',\n    testMatch: ['**/*.test.ts'], // nomenclaturas de arquivos que serão testados\n    moduleFileExtensions: ['ts', 'js'],\n    collectCoverage: true,\n    globals: {\n        'ts-jest': {\n            isolatedModules: true, // melhora a performance para grandes bases de código\n        },\n    },\n};\n```\nAdicione o script de teste do **Jest** ao seu **package.json**, basta rodar o comando **jest** para exectar seus arquivos de teste:\n```js\n \"scripts\": {\n    \"test\": \"jest\"\n  },\n```\nAssim só será necessário executar **npm test** para testar sua aplicação.\n\nAgora você tem o **Jest** em sua aplicação e poderá utiliza-lo para desenvolver e testar seu código.\n\n## O que vamos testar?\n\nO que vamos testar?\nVamos usar métodos de uma calculadora, uma coisa bem simples para iniciarmos.\n\nCrie uma pasta **src** para adicionar seu código:\n```ts\nexport interface ICalculator {\n    Sum(a: number, b: number) : number\n    Sub(a: number, b: number) : number\n    Mult(a: number, b: number) : number\n    Div(a: number, b: number) : number\n}\n\nexport class Calculator implements ICalculator {\n    Sum(a: number, b: number): number {\n        return a + b;\n    }\n\n    Sub(a: number, b: number): number {\n        return a - b;\n    }\n\n    Mult(a: number, b: number): number {\n        return a * b;\n    }\n\n    Div(a: number, b: number): number {\n        return a / b;\n    }\n}\n```\n\nAgora temos a classe **Calculator** com os métodos de soma, subtração, multiplicação e divisão que iremos testar.\n\n## Testes com Jest\nPara escrever seus testes voce deverá criar uma pasta para seus testes e os arquivos de teste devem ter a nomenclatura especificada no arquivo de configuração, o padrão seria **.test.ts**, por exemplo:\n\n### test/sum.test.ts\n```ts\n// importamos a classe calculadora\nimport { Calculator } from \"../../src/Calculator\";\n\n// agora vemos a sintaxe do jets\n// onde você terá sua função de teste, que espera uma string com o nome ou uma breve descrição de seu teste\n// em seguida a função closure de seu teste\ntest(\"A soma de 1 + 2 é igual a 3\", () =\u003e {\n    const calculator = new Calculator(); // criamos uma instancia da classe calculadora\n    const result = calculator.Sum(1, 2) // executamos o método de soma e armazenamos seu resultado\n\n    expect(result).toBe(3) // iniciamos a validação inserindo o valor resultado em expect e o valor do valor esperado em toBe\n});\n```\n\n### test/sub.test.ts\n```ts\nimport { Calculator } from \"../../src/Calculator\";\n\ntest(\"A subtração de 3 - 2 é igual a 1\", () =\u003e {\n    const calculator = new Calculator();\n    const result = calculator.Sub(3, 2)\n\n    expect(result).toBe(1)\n});\n```\n\n### test/mult.test.ts\n```ts\nimport { Calculator } from \"../../src/Calculator\";\n\ntest(\"A multiplicação de 2 x 10 é igual a 20\", () =\u003e {\n    const calculator = new Calculator();\n    const result = calculator.Mult(2, 10)\n\n    expect(result).toBe(20)\n});\n```\n\n### test/div.test.ts\n```ts\nimport { Calculator } from \"../../src/Calculator\";\n\ntest(\"A divisão de 10 / 2 é igual a 5\", () =\u003e {\n    const calculator = new Calculator();\n    const result = calculator.Div(10, 2)\n\n    expect(result).toBe(5)\n});\n```\n\nEntão basicamente temos a execução do método, o resultado dele e a comparação entre o valor obtido no teste e o valor esperado como resultado.\n\nExecute e observer o resultado:\n```shell\n$ npm test\n```\nResultado com sucesso:\n```\n PASS  test/calculator/sum.test.ts     \n PASS  test/calculator/div.test.ts     \n PASS  test/calculator/sub.test.ts\n PASS  test/calculator/mult.test.ts\n---------------|---------|----------|---------|---------|-------------------\nFile           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n---------------|---------|----------|---------|---------|-------------------\nAll files      |     100 |      100 |     100 |     100 |                   \n Calculator.ts |     100 |      100 |     100 |     100 |                   \n---------------|---------|----------|---------|---------|-------------------\n\nTest Suites: 4 passed, 4 total\nTests:       4 passed, 4 total\nSnapshots:   0 total\nTime:        2.481 s\nRan all test suites.\n```\nAlterando o valod esperado do teste de soma, podemos ver resultado com falha:\n```\n PASS  test/calculator/mult.test.ts    \n PASS  test/calculator/sub.test.ts     \n PASS  test/calculator/div.test.ts\n FAIL  test/calculator/sum.test.ts\n  ● A soma de 1 + 2 é igual a 3\n\n    expect(received).toBe(expected) // Object.is equality\n\n    Expected: 5\n    Received: 3\n\n      5 |     const result = calculator.Sum(1, 2)\n      6 |\n    \u003e 7 |     expect(result).toBe(5)\n        |                    ^\n      8 | });\n      9 |\n\n      at Object.\u003canonymous\u003e (test/calculator/sum.test.ts:7:20)\n\n---------------|---------|----------|---------|---------|-------------------\nFile           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n---------------|---------|----------|---------|---------|-------------------\nAll files      |     100 |      100 |     100 |     100 |                   \n Calculator.ts |     100 |      100 |     100 |     100 |                   \n---------------|---------|----------|---------|---------|-------------------\nTest Suites: 1 failed, 3 passed, 4 total\nTests:       1 failed, 3 passed, 4 total\nSnapshots:   0 total\nTime:        2.155 s\nRan all test suites.\n```\nO método de comparar os resultados obtidos e os experados com o **toBe** server apenas para valores unícos, como variáveis do tipo number, string, bool, mas e se quisermos validar uma estrutura de dados?\n\nTeremos que utilizar o **toEqual**, que percorrerá todos os valores em sua estrutura e fará a validação de cada um, veja a implementação:\n### /test/operation.test.ts\n```ts\nimport { Calculator } from \"../../src/Calculator\";\n\nclass Operation {\n    sum: number;\n    sub: number;\n    mult: number;\n    div: number;\n} \n\ntest(\"O resultado da operação deverá ser 1 2 3 4\", () =\u003e {\n\n    var resultExpected: Operation = {\n        sum: 1,\n        sub: 2,\n        mult: 3,\n        div: 4,\n    }\n\n    const calculator = new Calculator();\n\n    var operation = new Operation();\n\n    operation.sum = calculator.Sum(1, 0)\n    operation.sub = calculator.Sub(4, 2)\n    operation.mult = calculator.Mult(1, 3)\n    operation.div = calculator.Div(4, 1)\n\n    expect(operation).toEqual(resultExpected)\n});\n```\n\nResultado do teste com sucesso:\n```\n PASS  test/calculator/mult.test.ts\n PASS  test/calculator/sub.test.ts\n PASS  test/operation/operation.test.ts\n PASS  test/calculator/div.test.ts\n---------------|---------|----------|---------|---------|-------------------\nFile           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n---------------|---------|----------|---------|---------|-------------------\nAll files      |     100 |      100 |     100 |     100 |                   \n Calculator.ts |     100 |      100 |     100 |     100 |                   \n---------------|---------|----------|---------|---------|-------------------\n\nTest Suites: 5 passed, 5 total\nTests:       5 passed, 5 total\nSnapshots:   0 total\nTime:        2.061 s\nRan all test suites.\n```\nResultado do teste com falha (observe que o valor da divisão esperada foi alterado):\n```\n PASS  test/calculator/mult.test.ts\n PASS  test/calculator/div.test.ts\n PASS  test/calculator/sum.test.ts\n PASS  test/calculator/sub.test.ts     \n FAIL  test/operation/operation.test.ts\n  ● O resultado da operação deverá ser 1 2 3 4\n\n    expect(received).toEqual(expected) // deep equality\n\n    - Expected  - 2\n    + Received  + 2\n\n    - Object {\n    -   \"div\": 8,\n    + Operation {\n    +   \"div\": 4,\n        \"mult\": 3,\n        \"sub\": 2,\n        \"sum\": 1,\n      }\n\n      26 |     operation.div = calculator.Div(4, 1)\n      27 |\n    \u003e 28 |     expect(operation).toEqual(resultExpected)\n         |                       ^\n      29 | });\n\n      at Object.\u003canonymous\u003e (test/operation/operation.test.ts:28:23)\n\n---------------|---------|----------|---------|---------|-------------------\nFile           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n---------------|---------|----------|---------|---------|-------------------\nAll files      |     100 |      100 |     100 |     100 |                   \n Calculator.ts |     100 |      100 |     100 |     100 |                   \n---------------|---------|----------|---------|---------|-------------------\nTest Suites: 1 failed, 4 passed, 5 total\nTests:       1 failed, 4 passed, 5 total\nSnapshots:   0 total\nTime:        2.024 s\nRan all test suites.\n```\n\nExceto, **toBe** e **toEqual**, temos:\n\n**toBeNull:** Testa se o resultado passado tem valor igual a null.\n\n**toBeUndefined:** testa se o resultado passado tem valor igual a undefined.\n\n**toBeDefined:** testa se o resultado passado não tem valor igual a undefined.\n\n**toBeTruthy:** testa se o resultado passado tem valor que pode ser passado como true em um if.\n\n**toBeFalsy:** testa se o resultado passado tem valor que pode ser passado como false em um if.\n\n**toBeGreaterThan:** testa se o resultado passado é maior que o esperado.\n\n**toBeGreaterThanOrEqual:** testa se o resultado passado é maior ou igual ao esperado.\n\n**toBeLessThan:** testa se o resultado passado é menor que o esperado.\n\n**toBeLessThanOrEqual:** testa se o resultado passado é menor ou igual ao esperado.\n\nE existem muitas outras possibilidades, portanto, com o **Jest** você tem a capacidade de realizar testes em aplicações NodeJs de forma poderosa, simples e organizada.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwesleysbmartins%2Fnode_test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwesleysbmartins%2Fnode_test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwesleysbmartins%2Fnode_test/lists"}