У меня есть служба, которая выполняет вызов API, а затем устанавливает значения для объекта закрытого состояния, а затем отправляет обновление субъекту поведения.
@Injectable({
providedIn: 'root'
})
export class ExeService {
private state: IState = {
things: {}
};
public things$: BehaviorSubject<{ [key: string]: IThing }> = new BehaviorSubject<{ [key: string]: IThing }>(this.state.things);
constructor(
private http: HttpClient
) { }
public getThings() {
this.http.get('/api/things').subscribe({
next: (res) => {
this.state.things = res;
this.things$.next(this.state.things)
}
})
}
}
Я хочу проверить эти вызовы API и выполнить убедитесь, что они правильно устанавливают значения в состоянии и обновляют тему поведения.
describe('ExeService', () => {
let injector: TestBed;
let service: ExeService;
let httpMock: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
ExeService
],
imports: [
HttpClientTestingModule
]
});
injector = getTestBed();
service = injector.get(ExeService);
httpMock = injector.get(HttpTestingController);
});
afterEach(() => {
httpMock.verify();
});
it('Should get things', (done) => {
service.getThings();
service.things$.subscribe(things => {
if (Object.keys(things).length) {
expect(things).toEqual(MockedThings_ApiResponse);
done();
}
});
const req = httpMock.expectOne(`/api/things`);
expect(req.request.method).toEqual('GET');
req.flush(MockedThings_ApiResponse);
});
});
Когда тест выполняется, он фактически выполняет getThings()
и оценивает подписку на субъект поведения до req.flush
. Как я концептуально понимаю, все это не должно оцениваться, пока не будут предоставлены все параметры теста. Я получаю запрос 404 на http://localhost:9876/api/things
(тестовый порт кармы) и , затем делает тестовый запрос. (Я также получаю тонну 404 предупреждений от файлов SASS, пытающихся получить файлы шрифтов не в каталоге моего приложения, но это уже другая история).
Чтобы оценить, что у меня есть ожидаемые значения, я сначала должен проверить если субъект поведения имеет какие-либо значения, следовательно, Object.keys(things).length
. Я думаю, что это фактически делает тест недействительным, потому что, если службе не удалось его установить, expect()
никогда не произойдет и, следовательно, будет иметь ложное срабатывание. Однако, если я удаляю это, то тест не пройден из-за первоначального результата подписки, возвращающего {}
.
Вопрос: Я не понимаю, как это должно работать, или я настраиваю свою тесты совершенно неверно?