<aside> 💡 Data de publicação: 26/03/2023

</aside>

Quando estamos utilizando Observables sempre há uma dificuldade em como organizar os testes para que possamos entender e testar toda a nossa stream. Podemos testar da forma mais “simples” utilizando subscribes para validar os valores da nossa subscription, porém temos uma outra abordagem para testes reativos e os mesmos podem ser feitos com um Scheduler nativo da biblioteca.

Por isso foi criado o TestScheduler que é uma classe de utilidade e que podemos usar para ter um ambiente de teste assíncrono e confiar no resultado.Para começar, primeiro precisamos entender o conceito de hot e cold Observables. Com isso podemos entender mais facilmente como os diagramas funcionam.

Hot Observables

Esse tipo de Observable pode emitir mais de uma vez, ou seja, geram um producer para multiplos subscribes, podem muitas vezes atuar como listeners e conter informações diferentes com o passar do tempo. Esses Observables vão “produzir” valores mesmo quando não houver ninguém se inscrevendo nos mesmos, diferentemente do cold Observable, um exemplo prático de um hot Observable seria um Subject.

Cold Observables

Os Observables “gelados” geram um producer para cada subscriber, ou seja, toda vez que alguém se interessa e se inscreve, o Observable irá gerar um novo produtor de dados, um exemplo prático de um cold Observable seria uma requisição HTTP.

## Sintaxe de marble

Isso é uma simplificação da explicação disponível na documentação

Primeiro vamos testar um service de todos, esse service contém um BehaviorSubject dois getters e um método que modifica o esse mesmo Subject:

import { Injectable } from "@angular/core";
import { BehaviorSubject, filter, map } from "rxjs";
import { Todo } from "../models/todo.model";

@Injectable({
	providedIn: "root",
})
export class TodoService {

	private todos = new BehaviorSubject<Todo[]>([]);

	get todos$() {
		return this.todos.asObservable();
	}

	get todosCount$() {
		return this.todos$.pipe(
			map((todos) => todos.filter((todo) => !todo.completed).length)
		);
	}

	addTodo(todo: Todo) {
		this.todos.next([...this.todos.value, todo]);
	}
}

Testes com o padrão subscribe/done: