1
resposta

Como testar uma função anônima?

Tenho estas duas funções

  contador() {
    setInterval(() => this.countdownSeconds())
  }

  countdownSeconds() {
    console.log('mensagem');
  }

na função contador fiz um spyOn para o setInterval

  it(`#${PhotoFrameComponent.prototype.contador.name}
    should ...`, () => {
    spyOn(window, 'setInterval');

    component.contador();

    expect(window.setInterval).toHaveBeenCalledTimes(1);
  });

A pergunta é: Como posso testar a função anônima dentro do setInterval?

1 resposta

Olá, Silvino! Tudo bem?

Eu acredito que seja uma daquelas situações em que você pode aplicar alguns conceitos de arquitetura no seu código. No caso do contador, countdownSeconds é uma dependência. O que geralmente acontece quando construímos algo e depois criamos os testes é perceber que existe essa dependência entre componentes do código e usar a Inversão de Dependências para torná-lo mais flexível.

Assim, ao invés do contador utilizar o countdownSeconds, ele pode receber por parâmetro.

Então você poderia fazer algo assim:

contador(callback = this.countdownSeconds) {
    setInterval(() =>callback())
}

Agora, nesse exemplo específico, é questionável a utilidade de fazer o teste assim. Você poderia passar outra função para o contador no seu teste e verificar se ela foi chamada, mas isso significa que você está apenas verificando que a arrow function funcionou e isso teoricamente não é obrigação dos seus testes.

Então, como estamos falando de testes unitários, faz mais sentido criar um teste separado para countdownSeconds e dessa maneira você sabe que o contador funciona (chama setInterval) e o countdownSeconds também funciona. Agora, o próprio setInterval e a arrow function são implementações do JavaScript e é ele (e as APIs que ele usa) que precisam garantir nos próprios testes que tudo funciona perfeitamente.

Espero ter ajudado!