Angular: 测试 Http POST 方法
Angular: Testing Http POST method
我有一个简单的服务方法,它执行 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", todoListToAdd);
}
我想对这个方法进行单元测试并试过这样:
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);
const req = httpMock.expectOne("https://localhost:44305/todolist");
expect(req.request.method).toBe("POST");
expect(req.request.body).toEqual(expectedTodoList);
req.flush(expectedTodoList);
});
});
});
为什么会出现以下错误?
Error: Expected one matching request for criteria "Match URL: https://localhost:44305/todolist", found none.
正是我在add方法中调用的url,为什么找不到?
在此先感谢您的帮助
虽然您所有的模拟和导入都很好,但您忘记了 subscribe
返回的可观察对象。
这对于底层方法实际上 运行 很重要。
为了使其仅 subscribe
对流和内部 运行 你的断言起作用。
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
});
});
});
我有一个简单的服务方法,它执行 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", todoListToAdd);
}
我想对这个方法进行单元测试并试过这样:
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);
const req = httpMock.expectOne("https://localhost:44305/todolist");
expect(req.request.method).toBe("POST");
expect(req.request.body).toEqual(expectedTodoList);
req.flush(expectedTodoList);
});
});
});
为什么会出现以下错误?
Error: Expected one matching request for criteria "Match URL: https://localhost:44305/todolist", found none.
正是我在add方法中调用的url,为什么找不到?
在此先感谢您的帮助
虽然您所有的模拟和导入都很好,但您忘记了 subscribe
返回的可观察对象。
这对于底层方法实际上 运行 很重要。
为了使其仅 subscribe
对流和内部 运行 你的断言起作用。
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
});
});
});