首页 > 解决方案 > 错误:需要先调用TestBed.initTestEnvironment()

问题描述

我正在尝试对服务的角度进行测试。

这是我的部分代码



describe('AddressService', () => {

  let service: AddressService;
  let injector: TestBed;
  let httpTestingController: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [AddressService]
    });


    injector = getTestBed();
    service = injector.inject(AddressService);
    httpTestingController = injector.inject(HttpTestingController);
    
    // service = TestBed.inject(AddressService);
    

  });

  afterEach(() => {
    httpTestingController.verify();
  })

  httpTestingController = TestBed.inject(HttpTestingController);

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  const dummyAddressListResponse = {
    data: [
      {direccion: 'address1'}, {Colas: 'queue1'},
      {direccion: 'address2'}, {Colas: 'queue2'}
    ],
  };

  it('getAddress() should return data', () => {
    service.getAddress().subscribe((res) => {
      expect(res).toEqual(dummyAddressListResponse);
    });

    const req = httpTestingController.expectOne(`${environment.URI}/mock-address`);
    expect(req.request.method).toBe('GET');
    req.flush(dummyAddressListResponse);
  })

});

在运行测试ng test --main src/app/services/address/address.service.spec.ts

我看到这个错误Error: Need to call TestBed.initTestEnvironment() first

我已经搜索并没有看到任何解决方案,有人发生过这种情况吗?

标签: javascriptangularmockingfrontend

解决方案


第一件事:--main不应该使用,它指向一个入口点,而不是一个期望的测试,并且应该是src/test.ts.

要运行单个测试,请使用下一个命令:

ng 测试 --include "app/services/address/address.service.spec.ts"

测试应该有点不同:

describe('AddressService', () => {
  let service: AddressService;
  let injector: TestBed;
  let httpTestingController: HttpTestingController;

  beforeEach(async () => {
    // let's compile TestBed first.
    await TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [AddressService],
    }).compileComponents();

    // let's use TestBed.injector.
    service = TestBed.inject(AddressService);
    httpTestingController = TestBed.inject(HttpTestingController);
  });

  afterEach(() => {
    httpTestingController.verify();
  })

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  it('getAddress() should return data', () => {
    const dummyAddressListResponse = {
      data: [
        {direccion: 'address1'}, {Colas: 'queue1'},
        {direccion: 'address2'}, {Colas: 'queue2'}
      ],
    };

    let actual: any;
    service.getAddress().subscribe((res) => actual = res);

    const req = httpTestingController.expectOne(`${environment.URI}/mock-address`);
    expect(req.request.method).toBe('GET');
    req.flush(dummyAddressListResponse);

    expect(actual).toEqual(dummyAddressListResponse);
  });
});

推荐阅读