【问题标题】:Angular 2 instantiate global injector in parent in Karma Jasmine testAngular 2 在 Karma Jasmine 测试中在父级中实例化全局注入器
【发布时间】:2017-08-22 10:36:02
【问题描述】:

我的设置和这篇帖子一样https://stackoverflow.com/a/42462579/1818048

但我无法在我的 Karama Jasmine 测试中使用 ServiceLoctor.inject.get - 注射器为空

  constructor() {
    this.inject = ServiceLocator.injector.get(InjectionService);
    this.configService = ServiceLocator.injector.get(ConfigService);
}

在 app.moudle 模块中,我声明了以下内容,以便全局可用。

export class AppModule {
  constructor(private injector: Injector) {
    ServiceLocator.injector = this.injector;
  }
}

这是我的测试设置中的一个 sn-p

describe('MyButtonComponent', () => {
  let component: MyButtonComponent;
  let fixture: ComponentFixture<MyButtonComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ButtonComponent, MyButtonComponent],
      providers: [SomeService,
        { provide: Router, useClass: RouterTestingModule },
        { provide: ServerService, useClass: GenericMock },
      ]
    })
      .overrideComponent(ResourceService, {
        set: {
          providers: [
            { provide: ConfigService, useClass: ConfigServiceMock }
          ]
        }
      })
      .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(MyButtonComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });

});

现在,当我运行测试时,ServiceLocator.injector 为空。我怎样才能让 Karma Jasmin 在父级中设置这个或者这是不可能的?

【问题讨论】:

    标签: angular typescript karma-jasmine


    【解决方案1】:

    @estus 你的版本必须与我的不同,下面的代码对我有用。但你让我走上了正轨,谢谢。

      beforeEach(inject([Injector], (injector: Injector) => {
         ServiceLocator.injector = injector;
      }));
    

    【讨论】:

    • Angular 8 需要这个版本的语法
    【解决方案2】:

    这个全局注入器在 Angular 中是一个值得商榷的举动,因为它使应用程序单元依赖于其他应用程序单元 (AppModule) 并破坏了封装。

    基本上应该在单元测试中手动完成:

    beforeEach(inject(injector: Injector) => {
      ServiceLocator.injector = injector;
    }));
    

    然后撤消:

    afterEach(() => {
      ServiceLocator.injector = null;
    });
    

    更好的做法是将全局注入器移动到单独的模块中,这样它就可以包含在测试台配置中。

    【讨论】:

    • 我正在努力让它发挥作用。我收到各种错误,例如“,”预期和找不到名称“injector”和“{ ServiceLocator:any; }' 不可分配给“数字”类型的参数。
    猜你喜欢
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多