首页 > 解决方案 > 在不模拟的情况下从 Angular 测试 REST 服务器

问题描述

我知道我应该使用模拟测试来自 Angular 的 REST 服务器,并且网络上有许多示例如何做到这一点。但是假设我想在我可以完全控制的真实事物上测试服务。

这是工作的模拟版本:

describe('SgformsService', () => {
  let sgformsService: SgformsService
  let httpMock: HttpTestingController

  beforeEach(() => {
      TestBed.configureTestingModule({
        providers: [SgformsService],
        imports: [HttpClientTestingModule]
      })
      httpMock = TestBed.get(HttpTestingController);
      sgformsService = TestBed.get(SgformsService);
    });

    it('should return a single item when mocked', () => {
    sgformsService.getSingle().subscribe(
      (sg: SgFormsBase) => {
        expect(sg.id).toEqual(34)
        expect(sg.pat_no).toEqual(1704)
      })
      const req = httpMock.expectOne(
        'http://localhost:8000/getsingle/Endoskopie/1631/2019-03-19/arzt/0', 'call to api');
      expect(req.request.method).toBe('GET');
      req.flush({
        id: 34,
        pat_no: 1704
      })
   });
});

如何重定向它以使用 REST 服务器而不是模拟?下面的代码不起作用,因为我不知道如何为SgformsService.

describe('SgformsService without Mocking', () => {
  let sgformsService: SgformsService
  //let httpClient: HttpClient

  beforeEach(function() {
  //  httpClient = new HttpClient()
  //  sgformsService = new SgformsService(httpClient);
  });

  // https://angular.io/guide/testing#service-tests
  it('should return a single item from server',
    (done: DoneFn) => {
      sgformsService.getSingle().subscribe(
      (sg: SgFormsBase) => {
        expect(sg.id).toEqual(34)
        expect(sg.pat_no).toEqual(1704)
        done()
      });
    });

});

标签: angularresttesting

解决方案


供其他人参考,并在@peinarydevelopment 和@Igor 的帮助下:

import { TestBed } from '@angular/core/testing';
import { HttpClientModule } from '@angular/common/http';

import { SgformsService } from './sgforms.service';
import { SgFormsBase } from './sgforms-base';

describe('SgformsService', () => {
  let sgformsService: SgformsService

  beforeEach(() => {
      TestBed.configureTestingModule({
        providers: [SgformsService],
        imports: [HttpClientModule]
      })
      sgformsService = TestBed.get(SgformsService);
  });
  it('should return a single item', done =>  {
      sgformsService.getSingle().subscribe(
        (sg: SgFormsBase) => {
          expect(sg[0].id).toEqual(7)
          expect(sg[0].pat_no).toEqual(1631)
          done()
        });
      })
})

如果done您想使用expect. 如果您只想快速记录结果,done则不需要。

另请参阅https://angular.io/guide/testing#service-tests


推荐阅读