首页 > 解决方案 > Karma/Jasmine Angular InjectionToken 测试失败,除非我使用 fdescribe

问题描述

我有以下规格测试:

import { HttpClientTestingModule } from '@angular/common/http/testing';
import { Component } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { of } from 'rxjs';
import { BASE_API_URL } from 'src/app/tokens/baseApiUrl.token';
import { RbacPermissionsService } from '../services/rbac-permissions.service';
import { SharedModule } from '../shared.module';

@Component({
  selector: 'app-mock-test',
  template: `<div *appHasPermission="{ items: 'view' }"></div>`,
  providers: []
})
export class MockTestComponent {
  constructor() {}
}

describe('HasPermissionDirective', () => {
  let mockTestComponent: MockTestComponent;
  let mockTestFixture: ComponentFixture<MockTestComponent>;
  let rbacPermissionsService: RbacPermissionsService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [MockTestComponent],
      imports: [SharedModule, HttpClientTestingModule],
      providers: [{provide: BASE_API_URL, useValue: '/some_api/'}]
    });

    rbacPermissionsService = TestBed.get(RbacPermissionsService);
    mockTestFixture = TestBed.createComponent(MockTestComponent);
    mockTestComponent = mockTestFixture.componentInstance;
  });

  it('should have no divs when permission is false', done => {
    spyOn(rbacPermissionsService, 'getPermission').and.returnValue(of(false));
    mockTestFixture.whenStable().then(() => {
      mockTestFixture.detectChanges();
      const divs = mockTestFixture.nativeElement.getElementsByTagName('div');
      expect(divs.length).toBeFalsy();
      done();
    });
  });

  it('should have a visible view element when permission is true', done => {
    spyOn(rbacPermissionsService, 'getPermission').and.returnValue(of(true));
    mockTestFixture.whenStable().then(() => {
      mockTestFixture.detectChanges();
      const divs = mockTestFixture.nativeElement.getElementsByTagName('div');
      expect(divs.length).toBeTruthy();
      done();
    });
  });
});

当我与所有其他测试一起运行它时,它会失败并出现错误:

NullInjectorError: StaticInjectorError(DynamicTestModule)[InjectionToken ]: 
  StaticInjectorError(Platform: core)[InjectionToken ]: 
    NullInjectorError: No provider for InjectionToken !

但是当我通过fdescribe测试运行它时。

我全心全意地承认规格测试不是我的强项。我的直觉说它们可能是一个时间问题,因为测试是孤立地工作的,但在作为更大的测试组的一部分运行时却不是。

标签: javascriptangulartestingkarma-jasmineinjection-tokens

解决方案


推荐阅读