首页 > 解决方案 > 为什么在比较两个相同的对象时出现错误:'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;
  }
});

标签: angularkarma-jasmine

解决方案


您不是在比较相同的对象,而是在比较相同的对象,因此您必须使用toEqual(newPost)而不是toBe(newPost)如下:

expect(response).toEqual(newPost);

来自Jasmine Matchers文档:

toBe(expected): 期望实际值 === 到期望值。

toEqual(expected):使用深度相等比较,期望实际值等于预期值。


推荐阅读