【问题标题】:Why is my Angular http service unit test not failing?为什么我的 Angular http 服务单元测试没有失败?
【发布时间】:2020-07-25 18:40:11
【问题描述】:

您好,谁能告诉我为什么这个服务测试在它应该失败的时候总是通过? 如果这很重要,我正在使用 Jest。 数据是数组中的 1 个对象,但测试需要 5 个并且仍然通过! (控制台日志确实被命中并返回数据); 我无法在订阅中触发期望调用,我不明白为什么。

控制台日志正在运行,但预期没有。 我一定在做一些非常愚蠢的事情,但不确定是什么。 任何人都可以解释什么是错的吗?

import { TestBed, inject, getTestBed } from '@angular/core/testing';
import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing';
import { DataHandlerService } from './data-handler.service';

describe('DataHandlerService', () => {
    let injector: TestBed;
    let service: DataHandlerService;
    let httpMock: HttpTestingController;
  
    beforeEach(() => {
      TestBed.configureTestingModule({
        imports: [HttpClientTestingModule],
        providers: [DataHandlerService]
      });
  
      injector = getTestBed();
      httpMock = TestBed.get(HttpTestingController);
      service = TestBed.get(DataHandlerService);
    });
  
    afterEach(() => {
      httpMock.verify();
    });
  
    it('should be created', () => {
      service = TestBed.get(DataHandlerService);
      expect(service).toBeTruthy();
    });
  
  
    
    describe('getData()', () => {
      it('should trigger call', () => {
        
        const mockEvt = [{  
          audio: "N",
          city: "Madrid",
          country: "Spain",
          date: "1930-01-01",
        }];
    
        service.getData('/test').subscribe(evtData => {
          console.log('CALLING ..... ', evtData);
          expect(evtData.length).toEqual(5);
          expect(evtData[0].country).toBe('France');
        });
        
        const req = httpMock.expectOne("/test");
        expect(req.request.method).toBe('GET');
        req.flush(mockEvt);
      });
  
    });
  });

这是我正在测试的服务。现在是基本的。 核心测试运行后会添加更多细节。


  @Injectable({
    providedIn: 'root'
  })
  export class DataHandlerService {
    constructor(private http: HttpClient) { }
  
    getData(urlToFetch: string): Observable<any[]> {
      return this.http.get<any[]>(urlToFetch);   
    }
  }

【问题讨论】:

  • 你在哪里阅读evtData
  • evtData 是服务响应返回的数据。
  • 您应该在订阅代码末尾使用 done 回调,'req.flush(mockEvt);done();'
  • 我将 done() 应用到 it() 但它没有工作 - 失败的测试仍然通过。 it('should trigger call', (done) => { /// blah blah req.flush(mockEvt);done(); });
  • 使用 async then done() 会导致错误。 it('应该触发调用', async((done) => { /// blah blah req.flush(mockEvt);done(); }));错误:TypeError:完成不是函数

标签: angular unit-testing jestjs angular-httpclient


【解决方案1】:

嗯……看起来如果我在没有 done() 的情况下使用 async(),那么测试会按预期运行。

it('should trigger call’,  async(() => {
    //// test info here
   //// means the subscribe is running correctly and the expects get triggered
}));

【讨论】:

  • 也许你应该把这个添加到你的问题中,我认为它没有回答你的问题:)
猜你喜欢
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多