首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用concatMap() Angular7测试链式http请求

用concatMap() Angular7测试链式http请求
EN

Stack Overflow用户
提问于 2018-12-21 16:32:54
回答 1查看 966关注 0票数 1

我想简单地测试我的todo.service-方法:

代码语言:javascript
复制
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();

最后我尝试了几件事,这就是我目前的状况:

代码语言:javascript
复制
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():

代码语言:javascript
复制
beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [TodoItemService, { provide: ApiUrlService, useClass: ApiUrlService }],
        imports: [HttpClientTestingModule],
    });

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

我在订阅书里不知道。如果创建调用看起来像:

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

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

只需执行POST请求订阅触发器。(但显然不是我想要的)所以我知道,我不得不嘲笑第二次接电话,也许也是?!

.match()操作符在HttpClientTestingModule上并没有真正帮助我。

EN

回答 1

Stack Overflow用户

发布于 2018-12-22 00:23:04

您需要模拟getAllTodoItemsByListId返回的内容。也许是这样的:

代码语言:javascript
复制
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();
}));

如果您还没有此导入,则可能还需要此导入:

代码语言:javascript
复制
import { of } from 'rxjs';
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53888090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档