تكرار السؤال: …
الإجابة المختصرة
تجريد رسمي للوقت والمؤقتات يُحقن في الخدمات كـ TimeProvider؛ ويتيح في الاختبارات تجميد وتمرير الوقت يدوياً عبر FakeTimeProvider دون انتظار حقيقي.
الشرح
قديماً، كان المطورون يكتبون واجهات مخصصة مثل IDateTimeProvider لاستبدال DateTime.UtcNow في الاختبارات. في .NET 8، وفرت مايكروسوفت TimeProvider كمعيار موحد في الـ BCL. في بيئة الاختبار، تحقن حزمة Microsoft.Extensions.Time.Testing فئة FakeTimeProvider؛ وتستطيع استدعاء fakeTime.Advance(TimeSpan.FromMinutes(10)) ليتم إطلاق المؤقتات وفحص انتهاء الصلاحيات لحظياً وبصفر انتظار.
مثال بالكود
// في خدمة الأعمال
public class TokenService(TimeProvider timeProvider) {
public bool IsExpired(Token t) => timeProvider.GetUtcNow() > t.ExpiresAt;
}
// في الاختبار
var fakeTime = new FakeTimeProvider();
var service = new TokenService(fakeTime);
fakeTime.Advance(TimeSpan.FromDays(2));أخطاء شائعة
- استمرار استخدام DateTime.UtcNow أو Task.Delay المباشر في كود الخدمات مما يمنع اختبارها بحتمية وسرعة.