البرمجة

اختبار طلبات HTTP في Angular 2: دليل شامل

في Angular 2، يُعد اختبار الطلبات الHTTP مهمة حيوية لضمان أن تطبيقك يتفاعل بشكل صحيح مع الخدمات الخارجية. في مثالك، تحتاج إلى اختبار الخدمة التي تقوم بجلب بيانات من طلبين HTTP متزامنين باستخدام forkJoin. الهدف هو محاكاة هذه السلوكيات المتوقعة في اختباراتك.

للقيام بذلك، يمكنك استخدام MockBackend لمحاكاة الاتصالات HTTP وتقديم إجابات مزيفة للاختبار. ولكن يبدو أن لديك بعض المشكلات في رمز الاختبار الخاص بك. السبب في ذلك هو أنك تقوم بإرجاع قيمة Array من connection.mockRespond، وهذا ليس الطريقة الصحيحة للقيام بذلك.

فيما يلي تعديل لكود الاختبار الخاص بك:

typescript
describe('Test Load Init Data', () => { it('should load Menu Zones and Menu Sections', inject([XHRBackend, AppInitService], (mockBackend, appInitService) => { console.log('Lets do some testing'); // Mock the first connection mockBackend.connections.subscribe((connection: MockConnection) => { connection.mockRespond(new Response(new ResponseOptions({ body: JSON.stringify({ /* your mock data for file1.json */ }) }))); }); // Mock the second connection mockBackend.connections.subscribe((connection: MockConnection) => { connection.mockRespond(new Response(new ResponseOptions({ body: JSON.stringify({ /* your mock data for file2.json */ }) }))); }); appInitService.loadData().subscribe(data => { expect(data.x).toBeDefined(); expect(data.y).toBeDefined(); // Add more expectations based on your mock data }); })); });

تأكد من استخدام JSON.stringify لتحويل كائن البيانات المزيفة إلى سلسلة نصية، وقم بتكرار العملية لكل اتصال HTTP.

المزيد من المعلومات

في عملية اختبار طلبات HTTP في Angular 2، يمكنك تحسين تجربتك باستخدام HttpTestingController لضمان أن جميع الطلبات والردود تتم بشكل صحيح. إليك تحسين لاختبار الخدمة الخاص بك:

typescript
import { TestBed, inject, tick, fakeAsync } from '@angular/core/testing'; import { HttpModule, XHRBackend, ResponseOptions, Response } from '@angular/http'; import { HttpTestingController } from '@angular/common/http/testing'; import { AppInitService } from 'path/to/app-init.service'; describe('Test Load Init Data', () => { let httpTestingController: HttpTestingController; let appInitService: AppInitService; beforeEach(() => { TestBed.configureTestingModule({ imports: [HttpModule], providers: [ AppInitService, { provide: XHRBackend, useClass: HttpTestingController } ] }); httpTestingController = TestBed.inject(HttpTestingController); appInitService = TestBed.inject(AppInitService); }); it('should load Menu Zones and Menu Sections', fakeAsync(() => { console.log('Let\'s do some testing'); const file1Data = /* mock data for file1.json */; const file2Data = /* mock data for file2.json */; appInitService.loadData().subscribe(data => { expect(data.x).toEqual(file1Data); expect(data.y).toEqual(file2Data); // Add more assertions as needed }); const req1 = httpTestingController.expectOne('file1.json'); const req2 = httpTestingController.expectOne('file2.json'); req1.flush(file1Data); req2.flush(file2Data); tick(); httpTestingController.verify(); })); afterEach(() => { httpTestingController.verify(); }); });

تستخدم httpTestingController.expectOne لتأكيد أنه تم إرسال طلب HTTP واحد لكل من ‘file1.json’ و ‘file2.json’. بعد ذلك، يمكنك استخدام req1.flush و req2.flush لإرسال البيانات المزيفة كاستجابة لكل طلب.

يتم استخدام fakeAsync و tick للتحكم في التوقيت وضمان استكمال كل العمليات الرمزية قبل الانتقال إلى الخطوة التالية في الاختبار. يتم استدعاء httpTestingController.verify() في الـ afterEach للتأكد من أنه تم استخدام كل الطلبات المتوقعة والتحقق من عدم وجود طلبات إضافية غير متوقعة.

هذا يجعل اختباراتك أكثر دقة ويسهل عليك فحص كل جانب من جوانب الخدمة الخاصة بك بطريقة فعالة.

زر الذهاب إلى الأعلى