Simular outros componentes
Objetivos de aprendizagem
Após concluir esta unidade, você estará apto a:
- Descrever os stubs fornecidos pelo pacote sfdx-lwc-jest.
- Entender como substituir a configuração do Jest.
- Testar componentes fora de seu ambiente de desenvolvimento.
- Criar stubs para componentes externos.
Simular componentes básicos
O pacote sfdx-lwc-jest nos permite executar Jest nos componentes Web do Lightning. Ele define todas as configurações de Jest necessárias para executar testes sem alterações adicionais. Nós o usamos extensivamente nos módulos anteriores. Esse pacote contém um conjunto de stubs (programas que simulam os componentes dos quais o módulo que está em teste depende) para todos os componentes no namespace do Lightning. Isso abrange todos os componentes básicos do Lightning. Isso nos permite executar testes em nosso ambiente e fora do ambiente do Lightning. Os stubs são instalados no diretório src/lightning-stubs
, no diretório node-modules/@salesforce/sfdx-lwc-jest
.
Algumas vezes, pode ser necessário substituir os stubs padrão fornecidos. Isso é feito substituindo as configurações de Jest e criando stubs personalizados. Vamos percorrer as etapas para fazer isso para lightning-button.
Comece configurando os diretórios dos stubs personalizados no Visual Studio Code.
- Clique com o botão direito do mouse no diretório
force-app
e selecione Nova pasta. - Digite
test
como nome do novo diretório. - Clique com o botão direito do mouse no novo diretório
test
e selecione Nova pasta. - Digite
jest-mocks
como nome do novo diretório. - Clique com o botão direito do mouse no novo diretório
jest-mocks
e selecione Nova pasta. - Digite
lightning
como nome do novo diretório.
Esta é a raiz para os stubs de Componentes básicos do Lightning.
Em seguida, substitua a configuração do Jest atualizando o arquivo chamado jest.config.js
na raiz do seu projeto de Salesforce DX.
- Abra o arquivo
jest.config.js
. - Insira o seguinte bloco de código após a linha
...jestConfig
:moduleNameMapper: { '^lightning/button$': '<rootDir>/force-app/test/jest-mocks/lightning/button' },
Observe o
moduleNameMapper
. Ele está dizendo para o Jest onde encontrar o stub para olightning-button
. O primeiro traço é convertido em uma barra simples e a grafia do restante do nome do componente muda: antes, o nome estava inteiro em letras minúsculas, com as palavras separadas por hifens (“kebab case”); agora, não há mais separação entre as palavras, e a inicial de cada uma delas está em letra maiúscula (“camel case”). A barra simples é usada porque o resolvedor de módulo trata tudo que vem antes do primeiro traço como namespace. Aqui,<rootDir>
mapeia para a raiz do espaço de trabalho do Salesforce DX.O arquivo deve ficar assim:
const { jestConfig } = require('@salesforce/sfdx-lwc-jest/config'); module.exports = { ...jestConfig, moduleNameMapper: { '^lightning/button$': '
/force-app/test/jest-mocks/lightning/button' }, modulePathIgnorePatterns: [' /.localdevserver'] }; - Salve o arquivo.
Agora, vamos adicionar o stub button
ao diretório lightning
que acabamos de criar.
- Clique com o botão direito do mouse no diretório
lightning
que criamos nas últimas etapas e selecione Novo arquivo. - Digite
button.html
como nome do novo arquivo. - Insira o bloco de código a seguir no novo arquivo:
<template></template>
- Salve o arquivo.
- Clique com o botão direito do mouse no novo diretório
lightning
e selecione Novo arquivo. - Digite
button.js
como nome do novo arquivo. - Insira o bloco de código a seguir no novo arquivo:
import { LightningElement, api } from 'lwc'; export default class Button extends LightningElement { @api disabled; @api iconName; @api iconPosition; @api label; @api name; @api type; @api value; @api variant; }
- Salve o arquivo.
Esses dois arquivos são cópias dos arquivos lightning-button da pasta lightning-stubs. Eles permitem a substituição do lightning-button de base para testes de Jest, se necessário.
Agora podemos substituir os stubs padrão fornecidos por sfdx-lwc-jest. E os componentes de outros namespaces? Podemos lidar com esses casos com alguns poucos ajustes. Vamos nos aprofundar nisso em seguida.
Simular outros componentes
Vamos começar simulando componentes com um namespace diferente. Para fazer isso, você configura um componente da Web Lightning com um teste de Jest que falha e, em seguida, simularemos uma correção.
- Crie um novo componente Web do Lightning no Visual Studio Code.
- Defina o nome como
otherComponents
.
Agora vamos adicionar um componente com um namespace diferente ao LWC.
- Abra o arquivo
otherComponents.html
e adicione este código entre as marcas do modelo:<thunder-hammer-button onclick={makeNoise}></thunder-hammer-button>
- Salve o arquivo e execute o teste.
- O teste falha por um novo motivo:
Test suite failed to run Cannot find module 'thunder/hammerButton' from 'otherComponents.html'
Como o componente <thunder-hammer-button>
é de outro namespace e não está no diretório lwc
local, você precisa criar um stub e atualizar a configuração do Jest para mapear o nome desses componentes para o arquivo de simulação.
Primeiro, é necessário adicionar um diretório thunder para representar o namespace. Em seguida, adicione os arquivos para usar stubs.
- Clique com o botão direito do mouse no diretório
jest-mocks
localizado no diretórioforce-app/test/
e selecione Nova pasta. - Digite
thunder
como nome do novo diretório. - Clique com o botão direito do mouse no diretório
thunder
e selecione Novo arquivo. - Digite
hammerButton.html
como nome do novo arquivo. - Insira o bloco de código a seguir no novo arquivo:
<template></template>
- Salve o arquivo.
- Clique com o botão direito do mouse no novo diretório
thunder
e selecione Novo arquivo. - Digite
hammerButton.js
como nome do novo arquivo. - Insira o bloco de código a seguir no novo arquivo:
import { LightningElement, api } from 'lwc'; export default class HammerButton extends LightningElement { @api label; // any other implementation you may want to expose here }
- Salve o arquivo e execute o teste.
- O teste falha. Precisamos atualizar o arquivo de configuração do Jest.
- Abra
jest.config.js
e adicione esta linha logo abaixo da linhamoduleNameMapper: {
:'^thunder/hammerButton$': '<rootDir>/force-app/test/jest-mocks/thunder/hammerButton',
- Salve o arquivo e execute o teste.
- Maravilha! O teste passa.
Algumas vezes, o LWC com o qual você está trabalhando importará outro LWC que não estará no diretório LWC local de seu projeto do Salesforce DX, Sem um stub, isso fará com que o Jest falhe. Vamos testar isso.
- Abra o arquivo
otherComponents.html
e adicione este código após a primeira marca do modelo:<c-display-panel errors={error} notes={messages}></c-display-panel>
- Salve o arquivo e execute o teste.
- O teste falha, pois ele não consegue encontrar o componente.
Você pode corrigir isso com um stub. Para começar, crie o stub; depois, atualize a configuração do Jest.
- Clique com o botão direito do mouse no diretório
jest-mocks
localizado no diretórioforce-app/test/
e selecione Nova pasta. - Digite
c
como nome do novo componente. - Clique com o botão direito do mouse no diretório
c
e selecione Novo arquivo. - Digite
displayPanel.html
como nome do novo componente. - Insira o bloco de código a seguir no novo arquivo:
<template></template>
- Salve o arquivo.
- Clique com o botão direito do mouse no novo diretório
c
e selecione Novo arquivo. - Digite
displayPanel.js
como nome do novo arquivo. - Insira o bloco de código a seguir no novo arquivo:
import { LightningElement, api } from 'lwc'; export default class DisplayPanel extends LightningElement { @api errors; @api notes; // any other implementation you may want to expose here }
Observe que há um decorador de API para cada parâmetro passado na chamada do componente. - Salve o arquivo.
- Abra
jest.config.js
e adicione esta linha logo abaixo da linhamoduleNameMapper: {
:'^c/displayPanel$': '<rootDir>/force-app/test/jest-mocks/c/displayPanel',
- Salve o arquivo e execute o teste.
- O teste passa.
Muito bem! Agora você está preparado para escrever testes para todos os seus componentes Web do Lightning. Você também tem o poder de tornar essas implementações de stub tão sofisticadas ou tão simples quanto for necessário.