Тестирование связанных http-запросов с помощью concatMap () Angular7 - PullRequest
0 голосов
/ 21 декабря 2018

Я хотел бы просто протестировать мой todo.service -метод:

    create(listId: number, name: string): Observable<TodoItem[]> {
    const URL = `${this.apiUrlService.getApiUrl('list')}${listId}/Item`;

    return this.http.post(URL, { value: name }).pipe(concatMap(() => this.getAllTodoItemsByListId(listId)));
}

Как видите, это цепочечный http-вызов в сочетании с concatMap ();

Я закончил тем, что попробовал пару вещей, и это мое текущее состояние:

    it('should create an todoItem', fakeAsync(() => {
    const mockTodoItem = new TodoItem(1, 1, 'Test1');
    let postResponse: TodoItem[];

    todoItemService.create(1, 'NameOfList').subscribe((todoItems: TodoItem[]) => {
        postResponse = todoItems;
    });
    tick();
    httpMock
        .expectOne({
            url: `${apiUrlService.getApiUrl('list')}1/Item`,
            method: 'POST',
        })
        .flush(mockTodoItem);
    tick();
    expect(postResponse).toEqual([mockTodoItem]);

    httpMock.verify();
}));

Мой beforeEach ():

beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [TodoItemService, { provide: ApiUrlService, useClass: ApiUrlService }],
        imports: [HttpClientTestingModule],
    });

    todoItemService = TestBed.get(TodoItemService);
    httpMock = TestBed.get(HttpTestingController);
    apiUrlService = TestBed.get(ApiUrlService);
});

Я не получаю его внутриподписка.Если create -call выглядит так:

create(listId: number, name: string): Observable<TodoItem[]> {
    const URL = `${this.apiUrlService.getApiUrl('list')}${listId}/Item`;

    return this.http.post(URL, { value: name }));
}

, просто выполняя запрос POST, триггеры подписки запускаются.(Но, очевидно, не то, что я хочу) Итак, я получаю, что мне нужно каким-то образом смоделировать второй вызов GET?я.

1 Ответ

0 голосов
/ 22 декабря 2018

Вам нужно будет посмеяться над возвратом чего-то из getAllTodoItemsByListId.Возможно, что-то вроде этого:

it('should create an todoItem', fakeAsync(() => {
    const mockTodoItem = new TodoItem(1, 1, 'Test1');
    spyOn(todoItemService, 'getAllTodoItemsByListId').and.returnValue(of(mockTodoItem));
    let postResponse: TodoItem[];

    todoItemService.create(1, 'NameOfList').subscribe((todoItems: TodoItem[]) => {
        postResponse = todoItems;
    });
    tick();
    httpMock
        .expectOne({
            url: `${apiUrlService.getApiUrl('list')}1/Item`,
            method: 'POST',
        })
        .flush(mockTodoItem);
    tick();
    expect(postResponse).toEqual([mockTodoItem]);

    httpMock.verify();
}));

Может также потребоваться этот импорт, если у вас его еще нет:

import { of } from 'rxjs';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...