模拟指令以测试组件-茉莉花和因果报应的Angular 8

时间:2019-11-26 07:17:38

标签: angular unit-testing mocking karma-jasmine angular-directive

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

“ 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:无法读取未定义的属性'startsWith'”

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

Repo Link

请向我建议解决此问题的更好方法。

预先感谢

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

 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();
    },
  ));