angular - 为什么在比较两个相同的对象时出现错误:'Expected PostModel({ }) to be PostModel({ }).' 在我的测试中
问题描述
我正在尝试测试调用 API 的 Angular 服务,并比较响应。但之前我只是想比较没有数据的全局对象。而且我的代码的这一部分有一个错误 const resp: PostModel = service.setPost('data'); mockRequest.flush(resp); mockHttp.verify();
而且我不明白因为对我来说它们是相同的对象。这是
我的 post-service.ts
public addPost(newPost: PostModel): Observable<PostModel> {
return this.http.post(this.apiUrl + 'add', newPost).pipe( map( response => {
console.log('response: ', response);
return this.setPost(response);
}));
}
public setPost(data: any): PostModel{
let post: PostModel= new PostModel();
/**
post.id = data.id;
post.author = data.userId;
post.title = data.title;
post.content = data.content;
post.description = data.description;
post.img.push(data.img);
post.isHorror = !data.forChild;
*/
return post;
}
和
我的 post-service.spec.ts
import {inject, TestBed} from '@angular/core/testing';
import { HttpClientModule } from '@angular/common/http';
import {HttpClientTestingModule,HttpTestingController,} from '@angular/common/http/testing';
import PostModel from '../models/Post.model';
import { PostService } from './post.service';
describe('PostService', () => {
let mockHttp: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientModule, HttpClientTestingModule],
providers: [PostService]
});
mockHttp = TestBed.get(HttpTestingController);
});
it('should be created', inject( [PostService], (service: PostService) => {
expect(service).toBeTruthy();
}));
it('shoul call post and return PostModel', inject(
[PostService], (service: PostService) => {
const newPost: PostModel = new PostModel();
service.addPost(newPost).subscribe((response => {
expect(response).toBe(newPost);
}));
const mockRequest = mockHttp.expectOne('api/story/post/add');
expect(mockRequest.request.method).toEqual('POST');
/** const data = this.generatePostMock(); */
const resp: PostModel = service.setPost('data');
mockRequest.flush(resp);
mockHttp.verify();
}
));
generatePostMock(): PostModel {
let mock: PostModel = new PostModel();
mock.id = 1;
mock.author = 12;
mock.title = 'title';
mock.content = 'content';
mock.description = 'description';
mock.img.push('../assets/img/hell_dog.png');
mock.isHorror = true;
}
});
解决方案
您不是在比较相同的对象,而是在比较相同的对象,因此您必须使用toEqual(newPost)
而不是toBe(newPost)
如下:
expect(response).toEqual(newPost);
来自Jasmine Matchers文档:
toBe(expected)
: 期望实际值 === 到期望值。
toEqual(expected)
:使用深度相等比较,期望实际值等于预期值。
推荐阅读
- python - 我无法更改数据框列名,因为它有双引号
- python - Selenium 错误:元素不可交互(coockie 和其他弹出窗口)
- php - 用一个循环计算多数组的平均值
- r - 尝试使用定义的拆分模式使用 str_split,适用于样本(df)但不适用于完整文档(df 和 d.table)
- php - 将php电子邮件表单升级为smtp
- python-3.x - 在 Docker 容器化 Python 代码中加入路径时如何避免在文件路径中混合使用 \ 和 /
- r - 使用 ggpubr(ggline 函数)防止 X 轴上的标签重叠
- r - 无法进入 Rstudio 中的函数调用或循环
- opencv - 对图像应用相对径向失真函数,无需了解有关相机的任何信息
- node.js - 将 JS 承诺用于基于 Sequelize 的模型相关功能是否必不可少?