3
respostas

Esse teste está certo?

  it('Ao cadastrar um usuário, validar o retorno das informações do usuário', async () => {
    const data = {
      nome: 'John Doe',
      email: 'johndoe@example.com',
      senha: 'senha123',
    };

    const resultado = await authService.cadastrarUsuario(data);

    expect(resultado.content).toMatchObject(data);

    await Usuario.excluir(resultado.content.id);
  });

Como o método cadastrarUsuario altera data.senha, o objeto data usado no teste também é modificado.
Então o toMatchObject(data) não estaria comparando hash com hash em vez de validar corretamente o comportamento?

3 respostas

Bom dia, Luidi! Como vai?

Quando você utiliza toMatchObject(data), está comparando o objeto resultado.content com o objeto data. Se o método cadastrarUsuario altera a propriedade senha de data, como, por exemplo, criptografando-a, então realmente haverá uma discrepância na comparação, já que data.senha não refletirá a senha criptografada.

Para resolver isso, você pode ajustar o teste para verificar apenas as propriedades que não são alteradas ou para comparar a senha de forma adequada. Aqui está uma sugestão de como você pode ajustar seu teste:

it('Ao cadastrar um usuário, validar o retorno das informações do usuário', async () => {
  const data = {
    nome: 'John Doe',
    email: 'johndoe@example.com',
    senha: 'senha123',
  };

  const resultado = await authService.cadastrarUsuario(data);

  // Comparar apenas as propriedades que não são alteradas
  expect(resultado.content).toMatchObject({
    nome: data.nome,
    email: data.email,
  });

  // Opcionalmente, você pode verificar se a senha foi alterada
  expect(resultado.content.senha).not.toBe(data.senha);

  await Usuario.excluir(resultado.content.id);
});

Dessa forma, você está garantindo que apenas as informações que não devem ser alteradas sejam comparadas diretamente. E, se necessário, você pode adicionar verificações específicas para a senha, como garantir que ela foi realmente modificada.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Mas mesmo no exemplo q vc deu o objeto "data" é modificado dentro do método "cadastrar" então a senha vai sofrer o hash. Então "resultado.content.senha" vai ser igual ao "data.senha", pois o objeto "data" foi modificado. Como faz pra comparar corretamente?

Oi, Luidi!

Sim, se o método cadastrarUsuario muta o objeto recebido, então data.senha vira o hash e qualquer comparação direta com data perde o sentido. Resolva fazendo o seguinte: congele o valor original da senha antes de chamar o método (ou crie uma cópia profunda) e compare o retorno com esse valor imutável.

Veja este exemplo:


it('Ao cadastrar um usuário, validar o retorno das informações do usuário', async () => {
  const data = {
    nome: 'John Doe',
    email: 'johndoe@example.com',
    senha: 'senha123',
  };

  // Guarde a senha original (antes de qualquer mutação)
  const senhaOriginal = data.senha;

  // (Opcional) faça uma cópia para garantir que o service não use o mesmo objeto por referência
  const payload = { ...data };

  const resultado = await authService.cadastrarUsuario(payload);

  // Valida campos que devem permanecer iguais
  expect(resultado.content).toMatchObject({
    nome: data.nome,
    email: data.email,
  });

  // Valida que a senha retornada NÃO é a senha em texto puro
  expect(resultado.content.senha).not.toBe(senhaOriginal);

  // (Opcional) valida que o objeto original não foi alterado
  expect(data.senha).toBe(senhaOriginal);

  await Usuario.excluir(resultado.content.id);
});

Se você quiser validar que o hash corresponde à senha original, compare com o helper de verificação do mesmo algoritmo (ex.: bcrypt.compare), usando senhaOriginal.

Fico à disposição!