NullInjectorError:StaticInjectorError [[object Object]]

时间:2019-09-23 10:59:19

标签: angular jasmine

我正在尝试使用Jasmine和Karma创建我的第一个单元测试。

我无法弄清楚为什么会出现该错误。

以下代码:

  

AppComponent

import { Service1 } from './_services';
import { Service2 } from './_services';



  // ...Other import

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styles: [],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent implements OnInit, AfterViewInit {
  public someObs1$ = this.service1.someObs1$;
  public someObs2$ = this.service2.someObs1$;

  private me = 'app';

  constructor(
    private service1: Service1,
    private service2: Service2,

  ) {
  }

  ngOnInit(): void {
    this.service1.someMethod1(this.me);

  }

  ngAfterViewInit(): void {
   this.someObs1$.pipe(filter((val)=> val).subscribe(()=> this.service2.someMethod2(this.me));

  }
}

这里是我创建的测试

  

app.component.spec.ts

import {
  TestBed,
  async,
  ComponentFixture,
  inject,
  tick,
  fakeAsync,
} from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';

import { Service1 } from './_services';
import { Service2 } from './_services';
import { DebugElement, Component, Input } from '@angular/core';

import { from, of } from 'rxjs';
import { CommonModule } from '@angular/common';

@Component({
  selector: 'app-toolbar',
  template: '',
})
export class ToolbarStubComponent {
  @Input() isXs = false;
  @Input() isMobile = false;
}

@Component({
  selector: 'app-notifications',
  template: '',
})
export class NotificationsStubComponent {}

describe('AppComponent', () => {
  let component: AppComponent;
  let fixture: ComponentFixture<AppComponent>;
  let de: DebugElement;

  let service1Spy: jasmine.SpyObj<Service1>;
  let service2Spy: jasmine.SpyObj<Service2>;

    const spy1 = jasmine.createSpyObj('Service1', ['someMethod1']);
    const spy2 = jasmine.createSpyObj('Service2', ['someMethod2']);


    TestBed.configureTestingModule({
      declarations: [
        AppComponent,
        NotificationsStubComponent,
        ToolbarStubComponent,
      ],
      imports: [CommonModule, RouterTestingModule.withRoutes([])],
      providers: [
        { provide: Service1, useValue: spy1 },
        { provide: Service2, useValue: spy2 },
      ],
    }).compileComponents();

    fixture = TestBed.createComponent(AppComponent);
    component = fixture.componentInstance;
    de = fixture.debugElement;

    service1Spy = TestBed.get(spy1); // <-- Error here!
    service2Spy = TestBed.get(spy2);
    // fixture.detectChanges();
    expect(component).toBeDefined();
  });

});

错误似乎出在我调用TestBed.get()的那一行

  

错误

NullInjectorError: StaticInjectorError[[object Object]]: 
  NullInjectorError: No provider for [object Object]!
    at NullInjector.get (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm5/core.js:725:1)
    at resolveToken (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm5/core.js:11917:1)
    at tryResolveToken (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm5/core.js:11861:1)
    at StaticInjector.get (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm5/core.js:11763:1)
    at TestBedViewEngine.get (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm5/testing.js:2448:1)
    at Function.TestBedViewEngine.get (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm5/testing.js:2229:1)
    at Object.<anonymous> (http://localhost:9876/_karma_webpack_/src/app/app.component.spec.ts:99:17)
    at step (http://localhost:9876/_karma_webpack_/main.js:5911:23)
    at Object.next (http://localhost:9876/_karma_webpack_/main.js:5892:53)
    at http://localhost:9876/_karma_webpack_/main.js:5886:71

TestBed或Spy配置是否存在任何愚蠢的错误?

1 个答案:

答案 0 :(得分:2)

注入器使用WeakMap来获取依赖项。

这意味着它将检查对象的类型,而不是内存引用

尝试

service1Spy = TestBed.get(Service1);