75. اختبار الخدمات والنماذج الوهمية لحقن التبعية (Mocks)
تحتوي الخدمات على منطق الأعمال وجلب البيانات، مما يجعلها مرشحاً رئيسياً لاختبار الوحدات. عند اختبار خدمة تعتمد على خدمة أخرى (تبعية)، نستخدم النماذج الوهمية/المتجسسات لعزل الوحدة التي يتم اختبارها.
1. اختبار خدمة بدون تبعيات
نقوم بإنشاء مثيل للخدمة مباشرة.
typescript describe('MathService', () => { let service: MathService;
beforeEach(() => { service = new MathService(); });
it('should calculate the sum correctly', () => { expect(service.add(2, 3)).toBe(5); }); });
2. اختبار خدمة ذات تبعيات (Mocking)
غالباً ما نحتاج إلى عمل نماذج وهمية للتبعيات مثل HttpClient أو AuthService. بدلاً من إجراء استدعاءات API حقيقية، نستبدل التبعية بكائن تجسس يتحكم في القيمة المُرجَعة.
typescript describe('UserService', () => { let userService: UserService; let mockHttp: any; // التجسس/النموذج الوهمي لـ HttpClient
beforeEach(() => { // إنشاء نموذج وهمي بالأساليب التي نتوقع استدعاءها mockHttp = jasmine.createSpyObj('HttpClient', ['get']);
TestBed.configureTestingModule({
providers: [
UserService,
// توفير النموذج الوهمي بدلاً من HttpClient الحقيقي
{ provide: HttpClient, useValue: mockHttp }
]
});
userService = TestBed.inject(UserService);
});
it('should call GET when fetching users', () => { // تحديد ما يجب أن تُرجعه طريقة 'get' للنموذج الوهمي (Observable) mockHttp.get.and.returnValue(of([{ id: 1, name: 'Test' }]));
userService.getUsers().subscribe(users => {
expect(users.length).toBe(1);
});
// التحقق من استدعاء النموذج الوهمي بشكل صحيح
expect(mockHttp.get).toHaveBeenCalledWith('/api/users');
}); });
يسترد TestBed.inject() مثيل الخدمة الذي يعيش داخل وحدة الاختبار.