Arayüzlerle sahte nesneler ve test verisi oluşturucuları
Bağımlılıkları arayüzler aracılığıyla ekleyin, davranışı gözlemlemek için basit sahte nesneler yazın ve küçük bir test verisi oluşturucuyla karmaşık girdiler üretin.
Arayüzlerle sahte nesneler ve test verisi oluşturucuları, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 3 dersten oluşur.
Sahte nesnelerle yalıtım
Amaç: Test edilen kodu yalıtmak.
- Arayüzlere bağımlı olun
- Testlerde sahte nesneler sağlayın
- Karmaşık girdiler için küçük bir oluşturucu kullanın
- Gerçek dünyayı değil, çağrıları gözlemleyin
IClock ile zamanı eklemek
Zamanı IClock arkasında gizleyin. Testler, öngörülebilir sonuçlar için sahte bir saat iletir.
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() + "%");
}
}
Testlerde sahte uygulama
Bir sahte nesne, arayüzü uygular ve doğrulamaların kararlı olması için denetlenen veriler döndürür.
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);
}
}
}
Yan etkileri gözlemleme
Bir sahte nesne çağrıları yakalayabilir; böylece test, gerçek e-posta/SMS göndermeden yan etkileri doğrular.
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);
}
}
}
Test verisi oluşturucusu
Küçük bir oluşturucu, varsayılanları ayarlar ve yalnızca testin ihtiyaç duyduğu değerleri geçersiz kılar; böylece hazırlık kısa ve anlaşılır olur.
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);
}
}
}
Uygulama ipuçları
İpuçları:
- Yan etkileri yalıtmak için küçük arayüzleri tercih edin
- Sahte nesneleri küçük tutun; çıktıları alanlarda/listelerde yakalayın
- Oluşturucular makul varsayılanları ve akıcı ayarlayıcıları barındırır
- Testler öykü gibi okunmalıdır: hazırlık → çalıştırma → doğrulama
Yalıtım yaklaşımı
Özet
Özet: Arayüzleri ekleyin, davranışı denetlemek ve gözlemlemek için sahte nesneler kullanın ve küçük bir test verisi oluşturucusuyla girdileri hızlıca oluşturun.
Sıkça Sorulan Sorular
“Arayüzlerle sahte nesneler ve test verisi oluşturucuları” dersi ücretsiz mi?
Evet — “Arayüzlerle sahte nesneler ve test verisi oluşturucuları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 3 dersten oluşur.
“Arayüzlerle sahte nesneler ve test verisi oluşturucuları” dersinde ne öğreneceğim?
Bağımlılıkları arayüzler aracılığıyla ekleyin, davranışı gözlemlemek için basit sahte nesneler yazın ve küçük bir test verisi oluşturucuyla karmaşık girdiler üretin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 2. dersidir.
“Arayüzlerle sahte nesneler ve test verisi oluşturucuları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- xUnit/MSTest kurulumu ve doğrulamalar
- Arayüzlerle sahte nesneler ve test verisi oluşturucuları
- Başarısız testlerde hata ayıklama