Angular:在单元测试中模拟 HttpClient

标签 angular unit-testing karma-jasmine angular-unit-test

我有一个使用 httpClient 的服务,我想测试它:

@Injectable({
    providedIn: 'root'
})
export class TodolistService {

  constructor(private http: HttpClient) { }

  getTodoLists(): Observable<HttpResponse<TodoList[]>> {
    return this.http.get<TodoList[]>("https://localhost:44305/todolist", { observe: 'response' });
  }
}

我的单元测试设置如下所示:

import { TestBed, getTestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';

import { TodolistService } from './todolist.service';

describe('TodolistService', () => {
  let injector: TestBed;
  let service: TodolistService;
  let httpMock: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [ HttpClientTestingModule ],
      providers: [ TodolistService ]
    });

    injector = getTestBed();
    service = injector.get(TodolistService);
    httpMock = injector.get(HttpClientTestingModule);
  });

  afterEach(() => {
    httpMock.verify();
  });

  describe('#getTodoLists', () => {
    it('should return an Observable<TodoList[]>', () => {
      const dummyTodoLists = [ 
        { name: "todoList1", listItems: [{id: 1, description: "listitem1-1", done: false}, {id: 2, description: "listitem1-2", done: false}]},
        { name: "todoList2", listItems: [{id: 2, description: "listitem2-1", done: false}, {id: 4, description: "listitem2-2", done: false}]}
      ];
  
      service.getTodoLists().subscribe(todoLists => {
        expect(todoLists.body.length).toBe(2);
        expect(todoLists.body).toEqual(dummyTodoLists);
      });
  
      const req = httpMock.expectOne("https://localhost:44305/todolist");
      expect(req.request.method).toBe("GET");
      req.flush(dummyTodoLists);
    });
  });
});

不幸的是,测试失败并显示以下消息,我无法让它工作:

TodolistService > #getTodoLists > should return an Observable<TodoList[]>
TypeError: httpMock.expectOne is not a function

我做错了什么?

提前致谢

最佳答案

尝试在 beforeEach 中将 HttpClientTestingModule 更改为 HttpTestingController

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [ HttpClientTestingModule ],
      providers: [ TodolistService ]
    });

    injector = getTestBed();
    service = injector.get(TodolistService);
    httpMock = injector.get(HttpTestingController); // <-- here
  });

关于Angular:在单元测试中模拟 HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63156059/

相关文章:

angular - 将 Angular 2 升级到 Angular 4 没有导出成员 'AnimationDriver'

asp.net-mvc - Moq 表示不能为接口(interface)模拟传递构造函数参数

angular - angular2 应用程序中的 karma 测试异常

Javascript 又神秘了?

visual-studio - 从 Visual Studio 2017 部署 Angular 2 应用程序

Angular 2 : Escape character in component's input

unit-testing - Spock如何处理Mocked对象的相等性

angularjs - 从 $http 迁移到 Restangular,测试失败

angular - Angular 中注入(inject)服务的构造函数何时运行?

unit-testing - CakePHP 测试 - 单元测试