模拟指令以测试组件 - Angular 8 与 jasmine 和 Karma

Posted

技术标签:

【中文标题】模拟指令以测试组件 - Angular 8 与 jasmine 和 Karma【英文标题】:Mocking a Directive to Test a Component - Angular 8 with jasmine and Karma 【发布时间】:2020-03-21 13:25:00 【问题描述】:

我尝试为具有一些服务和指令的组件编写单元测试。该指令用于呈现由登录用户和访客用户区分的内容。

“appShowAuthed”默认值为“false”的模拟指令,测试用例通过。但是当我尝试更改该值时,它不会重新渲染视图。

html

<ng-container *appShowAuthed="true">
     <button  id="logout">Logout</button>
</ng-container>

 <ng-container *appShowAuthed="false">
   <button  id="login">Login</button>
</ng-container>

规格文件:

//Passing Case

  it('should show Login button and hide My Orders Button for not logged in user', async () => 
  
    await fixture.detectChanges();
    expect(fixture.debugElement.query(By.css('#login'))).not.toBeNull();
    expect(fixture.debugElement.query(By.css('#logout'))).toBeNull();
  );



//Failing Case

 it('should show Login button and hide My Orders Button for not logged in user', async () => 
    
       const datastore = TestBed.get(DataStoreService);
       datastore.isAuthenticated = of(true);

       fixture.detectChanges();
       await fixture.whenStable();
       await fixture.whenRenderingDone();
       expect(fixture.debugElement.query(By.css('#logout'))).not.toBeNull();
       expect(fixture.debugElement.query(By.css('#login'))).toBeNull();
    );

错误:“TypeError: Cannot read property 'startsWith' of undefined”

我已经用最少的代码添加了项目,以便在 gitHub 中重现问题。

Repo Link

请建议我一个更好的方法来解决这个问题。

提前致谢

【问题讨论】:

【参考方案1】:

尝试以下方法:

 it('should show Login button and hide My Orders Button for not logged in user', inject(
    [DataStoreService],
    async (injectService: DataStoreService) => 
      fixture.autoDetectChanges(true);
      injectService.isAuthenticated.next(true);
      await fixture.whenStable();
      await fixture.whenRenderingDone();
      expect(
        fixture.debugElement.query(By.css('#logout')),
      ).not.toBeNull();
      expect(fixture.debugElement.query(By.css('#login'))).toBeNull();
    ,
  ));

【讨论】:

以上是关于模拟指令以测试组件 - Angular 8 与 jasmine 和 Karma的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 单元测试组件,模拟 ContentChildren

带有 viewchild 和指令的 Angular 组件测试

Angular - 测试组件 - 从模拟返回 Promise.reject 时出错

模拟服务以调用本地 json-server 而不是远程端点 - 测试语法? (角度 2)

如何检查数据是不是已完成加载以使用异步管道 Angular 8

Dart 的 Web 组件与 Angular 的指令