加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular(Jasmine / Karma) – 错误:非法状态:无法加载指令的摘

发布时间:2020-12-17 10:25:00 所属栏目:安全 来源:网络整理
导读:我真的想解决这个错误,互联网上没有任何东西可以帮助我… LR-categories.component.spec.ts: export function main() { describe('LrCategoriesComponent',() = { let fixture: ComponentFixtureLrCategoriesComponent; let component: LrCategoriesCompone
我真的想解决这个错误,互联网上没有任何东西可以帮助我…

LR-categories.component.spec.ts:

export function main() {
  describe('LrCategoriesComponent',() => {
    let fixture: ComponentFixture<LrCategoriesComponent>;
    let component: LrCategoriesComponent;
    let de: DebugElement;
    let glService: GeneralLedgeService;
    let lrService: LrService;
    let spy: jasmine.Spy;

    beforeEach(async(() => {
      TestBed.configureTestingModule({
        declarations: [
          LrComponent,LrMappingsComponent,LrCategoriesComponent,],imports: [
          CommonModule,SharedModule,LrRoutingModule,AgGridModule.withComponents(
            [
              ButtonComponent,ColumnHeaderComponent,TypeaheadEditorComponent,ButtonGroupComponent
            ]
          )
        ],providers: [
          LrService,{ provide: GeneralLedgeService,useClass: MockGeneralLedgeService },CompleterService,]
      }).compileComponents().then(() => {
        // initialization
        fixture = TestBed.createComponent(LrCategoriesComponent);
        component = fixture.componentInstance;
        de = fixture.debugElement;

        // Service getters
        glService = de.injector.get(GeneralLedgeService);
        lrService = de.injector.get(LrService);
      });
    }));

    // beforeEach(() => {
    //   // initialization
    //   fixture = TestBed.createComponent(LrCategoriesComponent);
    //   component = fixture.componentInstance;
    //   de = fixture.debugElement;
    //
    //   // Service getters
    //   glService = de.injector.get(GeneralLedgeService);
    //   lrService = de.injector.get(LrService);
    // });

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

错误:

ERROR: ‘Unhandled Promise rejection:’,‘Illegal state: Could not load
the summary for directive LrCategoriesComponent.’

任何建议都被接受!我在这一点上绝望!

我找到了一个解决方案,我将引导您完成它(解决方案是第3点):

1.我从.compileComponents()移动了初始化内容.然后(()=> {…}); to beforeEach(()=> {…});.
(你可以看到它被评论)

export function main() {
  describe('LrCategoriesComponent',() => {
    let fixture: ComponentFixture<LrCategoriesComponent>;
    let component: LrCategoriesComponent;
    let de: DebugElement;
    let glService: GeneralLedgeService;
    let lrService: LrService;
    let spy: jasmine.Spy;

    beforeEach(async(() => {
      TestBed.configureTestingModule({
        // Module's stuff here
      }).compileComponents();
    }));

    beforeEach(() => {
      // initialization
      fixture = TestBed.createComponent(LrCategoriesComponent);
      component = fixture.componentInstance;
      de = fixture.debugElement;

      // Service getters
      glService = de.injector.get(GeneralLedgeService);
      lrService = de.injector.get(LrService);
    });

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

这给了我以下错误:

Error: This test module uses the component ToolBarComponent which is
using a “templateUrl” or “styleUrls”,but they were never compiled.

此错误是因为在SharedModule中声明的其中一个组件在编译时遇到了问题(实际上,这发生在SharedModule声明[]中的任何组件上).

因此,我开始寻找在导入SharedModule(或其他重型模块)时解决spec文件设置的方法.

2.我发现了一种新方法here:

const oldResetTestingModule = TestBed.resetTestingModule;
    beforeAll(done => (async () => {
      TestBed.resetTestingModule();
      TestBed.configureTestingModule({
       // Module's stuff here
      });
      await TestBed.compileComponents();

      // prevent Angular from resetting testing module
      TestBed.resetTestingModule = () => TestBed;
    })().then(done).catch(done.fail));

    afterAll(() => {
      // reinstate resetTestingModule method
      TestBed.resetTestingModule = oldResetTestingModule;
      TestBed.resetTestingModule();
    });

即使它最终以惊人的速度(5秒对20秒)完成所有工作,但这种方法有一个主要的缺点:每个describe()创建一次依赖关系,而不是每次测试.这意味着您从先前的测试用例继承了状态.我们不希望这样!

3.我回到原点,尝试理解并应用更智能的异步逻辑……:

– 解决方案 –

beforeEach(done => (async () => {
      TestBed.configureTestingModule({
        // Module's stuff here,including SharedModule
      });
      await TestBed.compileComponents();
    })().then(done).catch(done.fail));

    beforeEach(() => {
      // initialization
      fixture = TestBed.createComponent(LrCategoriesComponent);
      component = fixture.componentInstance;
      de = fixture.debugElement;

      // Service getters
      glService = de.injector.get(GeneralLedgeService);
      lrService = de.injector.get(LrService);
    });

通过使用async / await来确保在尝试编译Component之前正确配置了Module.

有了这个,我设法编译组件并有一个干净,新鲜的实例来测试每个测试用例场景!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读