Как выполнить Angular 8 модульный тест для службы с обещаниями и HTTP-запросами? - PullRequest
0 голосов
/ 29 февраля 2020

Я новичок в модульном тестировании, и у меня возникли проблемы с тестированием, когда я прошел некоторые из первых шагов

Я могу справиться с тестированием основных функций / сервисов, которые не имеют каких-либо зависимостей и имеют базовая c функциональность, но я сталкиваюсь с проблемами, когда функции усложняются с Promises и Observables и HTTP-запросами

Мне трудно найти примеры онлайн более сложного тестирования функций. Я пытался использовать шутки, шпионы, вызывать реальную службу и т. Д. c, но, возможно, я все делал неправильно? Я чувствую, что ответ прост, и мне не хватает чего-то маленького

Вот мой служебный файл (по крайней мере, часть, над которой я работаю)

@Injectable({providedIn: 'root'})
export class HelperService {
    constructor(private http: HttpClient, private titleService: Title) {}

    waitUntilProxyReady(url, timesChecked = 0) {
        return new Promise(resolve => {
            this.http.get(url, { responseType: 'text', observe: 'response' })
                .subscribe(async (response) => {
                    timesChecked++;
                    if (response.status > 308) {
                        console.log('Detected proxy URL as status:', response.status, '- trying again in a few seconds...');
                        if (timesChecked > 30) { // 2.5 mins
                            resolve(false);
                            return;
                        }
                        await this.sleep(5000);
                        resolve(this.waitUntilProxyReady(url));
                    } else {
                        resolve(true);
                    }
                }, async (error) => {
                    timesChecked++;
                    if (timesChecked > 30) { // 2.5 mins
                        resolve(false);
                        return;
                    }

                    console.log('Detected proxy URL as status:', error.status, '- trying again in a few seconds...');
                    await this.sleep(5000);
                    resolve(this.waitUntilProxyReady(url));
                }
            );
        });
    }
    sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

Что я хочу сделать, это проверить waitUntilProxyReady (), если response.status > 308, выполняет итерацию timesChecked и вызывается time.sleep (). Тогда, если response.status <= 307 вернет ли функция true

Любая помощь будет признательна, я застрял на этом некоторое время

Редактировать:

Это что у меня есть на стороне тестирования

import { TestBed, getTestBed, fakeAsync, tick, async } from '@angular/core/testing';
import { HelperService } from './helper';
import { HttpClient, HttpErrorResponse, HttpHandler } from '@angular/common/http';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';

describe('HelperService', () => {
    let httpClient: HttpClient;
    let httpTestingController: HttpTestingController;
    let helper: HelperService;
    beforeEach(() => {
        TestBed.configureTestingModule({
          // Import the HttpClient mocking services
          imports: [ HttpClientTestingModule ],
          // Provide the service-under-test and its dependencies
          providers: [
            HelperService,
          ]
        });
            // Inject the http, test controller, and service-under-test
    // as they will be referenced by each test.
        httpClient = TestBed.get(HttpClient);
        httpTestingController = TestBed.get(HttpTestingController);
        helper = TestBed.get(HelperService);
  });
    afterEach(() => {
        // After every test, assert that there are no more pending requests.
        httpTestingController.verify();
    });
    describe('waitUntilProxyReady', () => {
        beforeEach(() => {
            helper = TestBed.get(HelperService);
        })

        it('test', () => {
            let mockResponse = '123'
            helper.waitUntilProxyReady('google.com').then(response => {
                expect(response).toBeFalsy()
            })
            const req = httpTestingController.expectOne('google.com');
            expect(req.request.method).toEqual('GET');

            // Respond with the mock response
            req.flush(mockResponse, {status : 309, statusText: 'hi'})
        })
    })

Но req.flu sh отправляет только ответ этого

 HttpErrorResponse{headers: HttpHeaders{normalizedNames: Map{}, lazyUpdate: null, headers: Map{}}, status: 309, statusText: 'hi', url: 'https://google.com/', ok: false, name: 'HttpErrorResponse', message: 'Http failure response for /goo
gle.com/: '309 hi'status, error: '123'}

Но я не могу попасть в асин c (ответ) блок

...