Falsificações por meio de interfaces; criadores de dados de teste
Injete dependências por meio de interfaces, escreva falsificações simples para observar o comportamento e crie entradas complexas com um pequeno criador de dados de teste.
Falsificações por meio de interfaces; criadores de dados de teste é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 2 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 3 aulas no total.
Isolamento com implementações simuladas
Objetivo: Isolar o código em teste.
- Dependa de interfaces
- Forneça implementações simuladas nos testes
- Use um pequeno construtor para entradas complexas
- Observe as chamadas, não o mundo real
Injetar o tempo por meio de IClock
Oculte o tempo atrás de IClock. Os testes passarão um relógio simulado para obter resultados previsíveis.
using System;
public interface IClock { DateTime NowUtc(); }
public sealed class SystemClock : IClock
{
public DateTime NowUtc() { return DateTime.UtcNow; }
}
public sealed class DiscountService
{
private readonly IClock _clock;
public DiscountService(IClock clock) { _clock = clock; }
// 50% off on Black Friday (Nov 27), else 0
public int GetDiscountPercent()
{
DateTime d = _clock.NowUtc().Date;
if (d.Month == 11 && d.Day == 27) return 50;
return 0;
}
}
public class Program
{
public static void Main(string[] args)
{
DiscountService live = new DiscountService(new SystemClock());
Console.WriteLine("Today's discount: " + live.GetDiscountPercent() + "%");
}
}
Implementação simulada nos testes
Uma implementação simulada implementa a interface e retorna dados controlados para que as asserções sejam estáveis.
using System;
public interface IClock { DateTime NowUtc(); }
public sealed class FakeClock : IClock
{
private readonly DateTime _fixed;
public FakeClock(DateTime fixedUtc) { _fixed = fixedUtc; }
public DateTime NowUtc() { return _fixed; }
}
public static class Assert
{
public static void AreEqual(int expected, int actual)
{
if (expected != actual)
throw new Exception("Expected " + expected + " but got " + actual);
}
}
public sealed class DiscountService
{
private readonly IClock _clock;
public DiscountService(IClock clock) { _clock = clock; }
public int GetDiscountPercent()
{
DateTime d = _clock.NowUtc().Date;
if (d.Month == 11 && d.Day == 27) return 50;
return 0;
}
}
public class Program
{
public static void Main(string[] args)
{
try
{
// Black Friday: 2015-11-27
DiscountService s1 = new DiscountService(new FakeClock(new DateTime(2015, 11, 27, 0, 0, 0, DateTimeKind.Utc)));
Assert.AreEqual(50, s1.GetDiscountPercent());
// Normal day
DiscountService s2 = new DiscountService(new FakeClock(new DateTime(2015, 11, 26, 0, 0, 0, DateTimeKind.Utc)));
Assert.AreEqual(0, s2.GetDiscountPercent());
Console.WriteLine("PASS: discount logic with fake clock");
}
catch (Exception ex)
{
Console.WriteLine("FAIL: " + ex.Message);
}
}
}
Observar efeitos colaterais
Uma implementação simulada pode capturar chamadas para que o teste verifique efeitos colaterais sem enviar e-mails ou SMS reais.
using System;
using System.Collections.Generic;
public interface INotifier { void Send(string message); }
public sealed class OrderService
{
private readonly INotifier _notifier;
public OrderService(INotifier notifier) { _notifier = notifier; }
public void Place(string product, int qty)
{
if (qty <= 0) throw new ArgumentOutOfRangeException("qty");
// ...
_notifier.Send("Placed: " + product + " x" + qty);
}
}
public sealed class FakeNotifier : INotifier
{
public readonly List<string> Messages = new List<string>();
public void Send(string message) { Messages.Add(message); }
}
public static class Assert
{
public static void IsTrue(bool condition, string message)
{
if (!condition) throw new Exception(message);
}
}
public class Program
{
public static void Main(string[] args)
{
FakeNotifier fake = new FakeNotifier();
OrderService svc = new OrderService(fake);
try
{
svc.Place("Book", 2);
Assert.IsTrue(fake.Messages.Count == 1, "Expected exactly one notification");
Assert.IsTrue(fake.Messages[0].IndexOf("Book") >= 0, "Message should mention product");
Console.WriteLine("PASS: observed notification via fake");
}
catch (Exception ex)
{
Console.WriteLine("FAIL: " + ex.Message);
}
}
}
Construtor de dados de teste
Um pequeno construtor define valores padrão e substitui somente o que um teste precisa, tornando a preparação curta e clara.
using System;
public sealed class Order
{
public string Product;
public int Quantity;
public double UnitPrice;
public double Total() { return Quantity * UnitPrice; }
}
// Minimal builder for tests
public sealed class OrderBuilder
{
private string _product = "Item";
private int _qty = 1;
private double _price = 1.0;
public OrderBuilder WithProduct(string name) { _product = name; return this; }
public OrderBuilder WithQty(int qty) { _qty = qty; return this; }
public OrderBuilder WithPrice(double price) { _price = price; return this; }
public Order Build()
{
Order o = new Order();
o.Product = _product;
o.Quantity = _qty;
o.UnitPrice = _price;
return o;
}
}
public static class Assert
{
public static void AreEqual(double expected, double actual)
{
if (Math.Abs(expected - actual) > 0.0001)
throw new Exception("Expected " + expected + " but got " + actual);
}
}
public class Program
{
public static void Main(string[] args)
{
try
{
// Quick setup with readable intent
Order o = new OrderBuilder()
.WithProduct("Pen")
.WithQty(3)
.WithPrice(2.5)
.Build();
Assert.AreEqual(7.5, o.Total());
Console.WriteLine("PASS: builder created valid order");
}
catch (Exception ex)
{
Console.WriteLine("FAIL: " + ex.Message);
}
}
}
Dicas práticas
Dicas:
- Prefira interfaces pequenas para isolar efeitos colaterais
- Mantenha as implementações simuladas pequenas; capture saídas em campos/listas
- Os construtores mantêm valores padrão sensatos e métodos de configuração encadeados
- Os testes devem ser lidos como histórias: preparação → ação → asserção
Abordagem para o isolamento
Recapitulação
Recapitulação: injete interfaces, use implementações simuladas para controlar e observar o comportamento e crie entradas rapidamente com um pequeno construtor de dados de teste.
Perguntas Frequentes
A aula “Falsificações por meio de interfaces; criadores de dados de teste” é grátis?
Sim — o texto completo de “Falsificações por meio de interfaces; criadores de dados de teste” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 3 aulas no total.
O que vou aprender em “Falsificações por meio de interfaces; criadores de dados de teste”?
Injete dependências por meio de interfaces, escreva falsificações simples para observar o comportamento e crie entradas complexas com um pequeno criador de dados de teste. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 3.
Quanto tempo leva a aula “Falsificações por meio de interfaces; criadores de dados de teste”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Configuração e asserções de xUnit/MSTest
- Falsificações por meio de interfaces; criadores de dados de teste
- Depuração de testes que falham