Angular 角度:测试Http POST方法
我有一个简单的服务方法,它通过http post调用添加todoList:Angular 角度:测试Http POST方法,angular,unit-testing,karma-jasmine,angular-test,angular-unit-test,Angular,Unit Testing,Karma Jasmine,Angular Test,Angular Unit Test,我有一个简单的服务方法,它通过http post调用添加todoList: add(event: any): Observable<TodoList> { let todoListToAdd: TodoList = { name: event.target.value, listItems: []}; return this.http.post<TodoList>("https://localhost:44305/todolist",
add(event: any): Observable<TodoList> {
let todoListToAdd: TodoList = { name: event.target.value, listItems: []};
return this.http.post<TodoList>("https://localhost:44305/todolist", todoListToAdd);
}
为什么会出现以下错误
错误:需要一个条件匹配URL的匹配请求:https://localhost:44305/todolist,没有找到
它正是我在add方法中调用的url,为什么它找不到它
提前感谢您的帮助虽然您的模拟和导入都很好,但您忘记订阅返回的observable。 这对于实际运行参考底图方法非常重要。 要使其工作,只需订阅流并在内部运行断言
import { TestBed, getTestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { TodolistService } from './todolist.service';
import { TodoList } from './todolist';
import { HttpResponse } from '@angular/common/http';
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(HttpTestingController);
});
afterEach(() => {
httpMock.verify();
});
describe('#getTodoLists', () => {
it('getTodoLists - when called after add was called once, then it should return 3 todo lists', () => {
const event = { target: { value: "test" } };
const expectedTodoList: TodoList = { name: event.target.value, listItems: []};
service.add(event).subscribe((todoList) => {
expect(todoList).toEqual(expectedTodoList);
});
const req = httpMock.expectOne("https://localhost:44305/todolist");
expect(req.request.method).toBe("POST");
expect(req.request.body).toEqual(expectedTodoList);
req.flush(expectedTodoList); // This will actually "run" the mocked request if there are any subscribers
});
});
});
虽然所有的模拟和导入都很好,但您忘记订阅返回的可观察对象。 这对于实际运行参考底图方法非常重要。 要使其工作,只需订阅流并在内部运行断言
import { TestBed, getTestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { TodolistService } from './todolist.service';
import { TodoList } from './todolist';
import { HttpResponse } from '@angular/common/http';
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(HttpTestingController);
});
afterEach(() => {
httpMock.verify();
});
describe('#getTodoLists', () => {
it('getTodoLists - when called after add was called once, then it should return 3 todo lists', () => {
const event = { target: { value: "test" } };
const expectedTodoList: TodoList = { name: event.target.value, listItems: []};
service.add(event).subscribe((todoList) => {
expect(todoList).toEqual(expectedTodoList);
});
const req = httpMock.expectOne("https://localhost:44305/todolist");
expect(req.request.method).toBe("POST");
expect(req.request.body).toEqual(expectedTodoList);
req.flush(expectedTodoList); // This will actually "run" the mocked request if there are any subscribers
});
});
});
请共享您的整个测试床配置和您可能定义的模拟/间谍。嘿@PhilippMeissner我添加了整个测试类:请共享您的整个测试床配置和您可能定义的模拟/间谍。嘿@PhilippMeissner我添加了整个测试类:谢谢,这有点帮助,但不幸的是测试仍然失败。现在订阅和完成后,我得到了以下错误:错误:超时-异步函数未在jasmine设置的5000ms内完成。默认\u超时\u间隔错误:超时-异步函数未在jasmine设置的5000ms内完成。默认\u超时\u错误间隔:预期没有打开的请求,发现1:发布httpMock。验证确保没有打开的请求?啊,我的错。更新了我的答案。我已经有一段时间没有进行这部分测试了。谢谢,这有点帮助,但不幸的是,测试仍然失败。现在订阅和完成后,我得到了以下错误:错误:超时-异步函数未在jasmine设置的5000ms内完成。默认\u超时\u间隔错误:超时-异步函数未在jasmine设置的5000ms内完成。默认\u超时\u错误间隔:预期没有打开的请求,发现1:发布httpMock。验证确保没有打开的请求?啊,我的错。更新了我的答案。我已经有一段时间没做这部分测试了。