angular - Angular:在单元测试中模拟 HttpClient
问题描述
我有一个使用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 > 应该返回一个 Observable<TodoList[]>
TypeError: httpMock.expectOne is not a function
我究竟做错了什么?
提前致谢
解决方案
尝试更改HttpClientTestingModule
为HttpTestingController
inbeforeEach
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ HttpClientTestingModule ],
providers: [ TodolistService ]
});
injector = getTestBed();
service = injector.get(TodolistService);
httpMock = injector.get(HttpTestingController); // <-- here
});
推荐阅读
- php - php邮件程序发送邮件但未收到
- linux - 如何区分两个正在运行的同名Linux脚本?
- powershell - 从 Powershell 调用 Perl 脚本并将脚本输出存储在变量中
- python - 为什么 tensorflow 的 tf.random.uniform 在第一次运行时运行缓慢?
- visual-studio-code - 如何在扩展构建时确定 vscode 的当前和未来电子版本
- python - 添加一定数量的图像时,按钮网格垂直收缩
- vue.js - Vuetifyjs 2.0 主题不会随观察者而改变
- ios - 如何将 .arobject 文件转换为 .usdz 文件?
- javascript - vue js数据无法循环
- c++ - 为什么我收到转换函数错误?