1
resposta

[Dúvida] Cenário 2 não recebe await

  it('Não pode ser cadastrado um usuário com e-mail duplicado', async () => {
    const usuarioMock = {
      nome: 'Raphael',
      email: 'teste@gmail.com',
      senha: '123456',
    };

    const usuarioSave = authService.cadastrarUsuario(usuarioMock);

    await expect(usuarioSave).rejects.toThrowError('O email já esta cadastrado!');
  });

No trecho de código acima é contemplado o cenário 2 que devemos fazer um teste em que se verifica que o e-mail já está cadastrado no DB (esse trecho foi dado como resolução pelo instrutor). Porém, notei que somente neste cenário o serviço é chamado sem o await, mas mesmo assim o teste passa.

async cadastrarUsuario(data) {
    try {
      if (!data.nome) {
        throw new Error('O nome de usuário é obrigatório!');
      }
      if (!data.email) {
        throw new Error('O email de usuário é obrigatório!');
      }
      if (!data.senha) {
        throw new Error('A senha de usuário é obrigatório!');
      }
      const usuarioCadastrado = await Usuario.pegarPeloEmail(data.email);
      if (usuarioCadastrado) {
        throw new Error('O email já esta cadastrado!');
      }
      data.senha = await bcryptjs.hash(data.senha, 8);
      const usuario = new Usuario(data);
      const resposta = await usuario.salvar(usuario);
      return { message: 'usuario criado', content: resposta };
    } catch (err) {
      throw new Error(err.message);
    }
  }

Este segundo trecho mostra que o teste deveria falhar na chamada de Usuario.pegarPeloEmail, que é assíncrona.

static async pegarPeloEmail(email) {
    const resultado = await db.select('*').from('usuarios').where({ email });
    return resultado[0];
  }

Minha dúvida portanto é por que a chamada pelo teste não recebe await antes de chamar o serviço, visto que por ele chamamos uma função assíncrona e mesmo assim temos o resultado correto ? Todos os outros cenários levam await na chamada do serviço.

1 resposta

É uma boa observação! Parece que você está se referindo ao fato de que no trecho de teste específico, a função authService.cadastrarUsuario é chamada sem o await, enquanto em outros cenários ela é chamada com o await. Isso pode parecer contraditório, mas há uma explicação.

Na verdade, o uso do await depende de como a função de teste está estruturada e como ela lida com as Promessas (Promises). Quando você usa o await, o teste aguarda a resolução da Promise antes de prosseguir, o que é crucial para lidar com operações assíncronas.

No cenário específico que você mencionou, a função authService.cadastrarUsuario provavelmente retorna uma Promise. Se a função de teste (aquele que contém esse trecho de código) estiver marcada como async, o JavaScript permitirá que ela aguarde a resolução da Promise antes de continuar.

Se a função de teste não for marcada como async, você teria que usar .then() para lidar com a Promise. Mas, nesse caso, você ainda precisa garantir que o teste aguarde a conclusão da operação assíncrona antes de verificar o resultado.

O trecho de código que você forneceu não mostra a função de teste completa, então eu assumi que a função de teste envolve alguma operação assíncrona. Se a função de teste não é assíncrona, então o await na chamada de authService.cadastrarUsuario não faria sentido, e a função de teste continuaria sem esperar a Promise ser resolvida.

Em resumo, o uso do await depende da natureza da função de teste em que está sendo usado. Se a função de teste é assíncrona, o await é apropriado para garantir que as operações assíncronas sejam tratadas corretamente.

Valeus!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software