Я новичок в модульном тестировании, и у меня возникли проблемы с тестированием, когда я прошел некоторые из первых шагов
Я могу справиться с тестированием основных функций / сервисов, которые не имеют каких-либо зависимостей и имеют базовая 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 (ответ) блок