Testes de código .NET com MSTest, de eventos de domínio a HTTP, explicados a fundo, um de cada vez.
Uma instância por teste, a ordem exata dos hooks provada por um teste, TestContext pelo construtor, Throws contra ThrowsExactly, e o que estado static faz com testes em paralelo, no MSTest 4 com .NET 10.
Linhas nas bordas e não no meio, o que cabe num DataRow (e por que decimal não cabe), DynamicData com TestDataRow, um ITestDataSource customizado, CombinatorialData e nomes que mudam a cada execução, no MSTest 4.
Fake escrito à mão ou substituto do NSubstitute, o que um substituto não configurado devolve, o que não dá para substituir, e como Received, Arg.Any e valores default deixam um teste verde que não prova nada.
Um HttpMessageHandler fake escrito à mão no último elo da cadeia real, o typed client num ServiceCollection de teste e o pipeline de Microsoft.Extensions.Http.Resilience (retry, timeout, circuit breaker) num FakeTimeProvider, contando tentativas e o que cada uma enviou.
Injete TimeProvider onde o tempo é lido, teste cada limite exatamente na fronteira, e conduza timers, Task.Delay, deadlines e PeriodicTimer com FakeTimeProvider, sem dormir.
Teste um worker com Channel e PeriodicTimer sem dormir: FakeTimeProvider, sinais com prazo, ExecuteTask e FakeLogger para ver a falha que o StopAsync esconde, e o mesmo worker dentro de um host real.
Suba a API real em memória com WebApplicationFactory e MSTest, troque só o que o teste não alcança, compartilhe um host por classe sem vazar estado e confira status, Location, ProblemDetails e redirects.
Um esquema de autenticação fake controlado por headers, 401 e 403 conferidos à parte, testes unitários de AuthorizationHandler e de policies via IAuthorizationService, JWT real assinado com chave de teste e uma auditoria de todos os endpoints.
Um container PostgreSQL por execução com Testcontainers, um banco por classe de teste, isolamento por transação, Respawn ou TRUNCATE, e testes de aprendizado que mostram o que o InMemory e o SQLite deixam passar.
Em PostgreSQL de verdade, teste a tradução de queries, query filters nomeados, concorrência otimista com xmin, violação de unique como erro de domínio, migrations e drift de modelo, e conte comandos SQL para pegar N+1.