تكرار السؤال: …
الإجابة المختصرة
تشغل حاوية Docker حقيقية لقاعدة البيانات أثناء تشغيل الاختبارات، وتطبق الـ migrations عليها، وتدمرها تلقائياً بعد الانتهاء، مما يقضي على مشاكل الفروق بين InMemory والواقع.
الشرح
استخدام EF Core InMemory Database في الاختبارات خطير جداً؛ لأنها لا تدعم الـ Transactions الحقيقية، ولا تفحص الـ Foreign Keys، ولا تدعم استعلامات الـ Raw SQL أو ميزات المحرك الأصلية. توفر حزمة Testcontainers تشغيل حاوية SQL حقيقية متطابقة مع الإنتاج في ثوانٍ، مما يمنحك ثقة أعلى في صحة استعلامات قاعدة البيانات وتوافق الفهارس والقيود.
مثال بالكود
public class DatabaseFixture : IAsyncLifetime {
private readonly MsSqlContainer _container = new MsSqlBuilder().Build();
public string ConnectionString => _container.GetConnectionString();
public async Task InitializeAsync() => await _container.StartAsync();
public async Task DisposeAsync() => await _container.DisposeAsync();
}أخطاء شائعة
- إعادة تشغيل حاوية جديدة لكل اختبار فردي بدلاً من مشاركة الحاوية عبر IClassFixture وتنظيف الجداول بالـ Respawn.