التزييف عبر الواجهات ومنشئو بيانات الاختبار
احقن التبعيات عبر الواجهات، واكتب تزييفات بسيطة لمراقبة السلوك، وأنشئ مدخلات معقدة باستخدام منشئ صغير لبيانات الاختبار.
التزييف عبر الواجهات ومنشئو بيانات الاختبار درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.
العزل باستخدام البدائل الوهمية
الهدف: عزل الكود قيد الاختبار.
- اعتمد على الواجهات
- وفّر بدائل وهمية في الاختبارات
- استخدم منشئًا صغيرًا للمدخلات المعقدة
- راقب الاستدعاءات بدلًا من العالم الحقيقي
حقن الوقت عبر IClock
أخفِ الوقت خلف IClock. وستمّرر الاختبارات ساعة وهمية للحصول على نتائج يمكن التنبؤ بها.
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() + "%");
}
}
تنفيذ وهمي في الاختبارات
يطبّق البديل الوهمي الواجهة ويعيد بيانات مضبوطة، بحيث تظل التأكيدات مستقرة.
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);
}
}
}
مراقبة الآثار الجانبية
يمكن لبديل وهمي التقاط الاستدعاءات، بحيث يتحقق الاختبار من الآثار الجانبية دون إرسال بريد إلكتروني أو رسائل SMS حقيقية.
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);
}
}
}
منشئ بيانات الاختبار
يضبط المنشئ الصغير القيم الافتراضية، ولا يغيّر إلا ما يحتاج إليه الاختبار، مما يجعل الإعداد قصيرًا وواضحًا.
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);
}
}
}
نصائح عملية
نصائح:
- فضّل الواجهات الصغيرة لعزل الآثار الجانبية
- اجعل البدائل الوهمية صغيرة؛ والتقط المخرجات في الحقول أو القوائم
- تحتوي المنشئات على قيم افتراضية مع دوال ضبط متسلسلة
- تُقرأ الاختبارات كالقصص: إعداد → تنفيذ → تأكيد
نهج العزل
مراجعة
مراجعة: احقن الواجهات، واستخدم البدائل الوهمية للتحكم في السلوك ومراقبته، وأنشئ المدخلات بسرعة باستخدام منشئ صغير لبيانات الاختبار.
الأسئلة الشائعة
هل درس «التزييف عبر الواجهات ومنشئو بيانات الاختبار» مجاني؟
نعم — نص درس «التزييف عبر الواجهات ومنشئو بيانات الاختبار» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.
ماذا ستتعلم في «التزييف عبر الواجهات ومنشئو بيانات الاختبار»؟
احقن التبعيات عبر الواجهات، واكتب تزييفات بسيطة لمراقبة السلوك، وأنشئ مدخلات معقدة باستخدام منشئ صغير لبيانات الاختبار. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.
كم من الوقت يستغرق درس «التزييف عبر الواجهات ومنشئو بيانات الاختبار»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إعداد xUnit/MSTest والتوكيدات
- التزييف عبر الواجهات ومنشئو بيانات الاختبار
- تصحيح أخطاء الاختبارات الفاشلة