Pular para o conteúdo principal

Jasmine

Documentação Oficial: https://jasmine.github.io/index.html

Jasmine é um framework de testes behavior-driven (BDD) para JavaScript. Ele permite escrever testes automatizados de forma descritiva e legível, sem necessidade de navegador ou outras bibliotecas externas. Jasmine é amplamente utilizado para validar o comportamento de aplicações web, incluindo código síncrono e assíncrono.

Diferença entre teste síncrono e assíncrono

  • Testes síncronos verificam o comportamento de funções que executam e retornam resultados imediatamente. O teste é executado de forma sequencial, linha por linha.

  • Testes assíncronos são usados quando o resultado depende de operações que levam tempo, como requisições HTTP, setTimeout, leitura de arquivos ou Promises. Nesses casos, o Jasmine precisa saber que deve aguardar a conclusão da operação assíncrona antes de avaliar o teste.

Mocks

São objetos simulados usados em testes automatizados para imitar o comportamento de componentes reais, permitindo isolar a unidade de código testada e controlar seus cenários de execução. Eles são úteis para verificar interações, definir retornos controlados e evitar efeitos colaterais de dependências externas.

No Jasmine, os spies são a principal forma de implementar mocks: eles monitoram chamadas de funções (como quantas vezes foram chamadas e com quais argumentos), permitem substituir a implementação real por versões simuladas e facilitam a verificação de interações durante o teste.

São criados para atender a casos de teste específicos.

1. Async/await

Normalmente, a maneira mais conveniente de escrever testes assíncronos é usar async/await.
Funções async retornam implicitamente uma Promise. O Jasmine aguardará até que a Promise retornada seja resolvida ou rejeitada antes de prosseguir para o próximo item na fila.
Promises rejeitadas causarão a falha do teste, ou uma falha no nível do conjunto (suite-level failure) no caso de beforeAll ou afterAll.

Exemplo

beforeEach(async function() {
await preparaAmbiente();
});

it('deve retornar o valor esperado', async function() {
const resultado = await buscarValor();
expect(resultado).toEqual(42);
});

2. Promises

Você também pode retornar diretamente uma Promise. O Jasmine reconhecerá automaticamente e aguardará a resolução ou rejeição.

Exemplo

beforeEach(function() {
return preparaAmbiente();
});

it('deve resolver a promessa corretamente', function() {
return buscarValor().then(function(resultado) {
expect(resultado).toEqual(42);
});
});

3. Callbacks (done)

Se uma função de teste ou beforeEach aceita um argumento, o Jasmine passará uma função especial chamada done. Seu código deve chamar done() ao concluir a operação assíncrona.

⚠️ Atenção: done() deve ser chamado exatamente uma vez, e apenas após o término do teste.

Exemplo

beforeEach(function(done) {
preparaAmbiente(() => {
done();
});
});

it('deve retornar resultado via callback', function(done) {
buscarValorComCallback(function(resultado) {
expect(resultado).toEqual(42);
done();
});
});

Lidando com erros

Para indicar uma falha ao Jasmine ao usar done, chame done.fail():

it('deve tratar erro no callback', function(done) {
buscarComErro(function(err, resultado) {
if (err) {
done.fail(err);
return;
}
expect(resultado).toBe(42);
done();
});
});

4. Relógio Simulado com jasmine.clock()

Quando se testa código baseado em tempo (como setTimeout), é possível simular a passagem do tempo usando o relógio falso do Jasmine.

Exemplo

beforeEach(function() {
jasmine.clock().install();
});

afterEach(function() {
jasmine.clock().uninstall();
});

it('deve executar após 10 segundos', function() {
const callback = jasmine.createSpy('callback');

executarDepois(callback); // executa após 10s

jasmine.clock().tick(10000); // simula a passagem do tempo

expect(callback).toHaveBeenCalledWith(12345);
});

Resumo

AbordagemCaracterísticas principaisQuando falha
async/awaitSintaxe moderna, clara e recomendadaPromise rejeitada ou erro lançado
PromisesRetorno direto de Promise, sem async/awaitPromise rejeitada
Callbacks (done)Para APIs antigas ou base legadodone() não chamado ou chamado incorretamente
Relógio SimuladoTesta delays com setTimeout sem esperar de verdadeSe esquecer install() ou uninstall()

Cebraspe

Código da Questão: Q3167138
Ano: 2025
Banca: CESPE / CEBRASPE
Órgão: TRF - 6ª REGIÃO
Cargo: Analista Judiciário — Área: Apoio Especializado — Especialidade: Análise de Sistemas de Informação

No que se refere a testes de verificação de qualidade de códigos automatizados e à persistência, julgue o próximo item.

Nos testes com Jasmine, o comando beforeAll pode ser utilizado com promises ou funções assíncronas (como async ou await), para garantir que o código de preparação seja executado de forma assíncrona, antes dos testes.

  • ( ) Certo
  • ( ) Errado

Gabarito oficial: Certo ✅