在onInit

时间:2018-02-17 13:36:04

标签: angular angular-directive angular-test

我有一个Angular Directive,它在onInit方法中调用授权服务。它看起来像是:

@Directive({
  selector: '[checkRights]'
})
export class RightsDirective implements OnInit{

  @Input('checkRights') expectedRights: Right[];

  constructor(private _element: ElementRef, private _userService: UserService) {
  }

  ngOnInit() {
    this._userService.hasAnyRights(this.expectedRights).subscribe(hasRights => {
      if(hasRights){
        this._element.nativeElement.remove();
      }
    })
  }
}

我想测试它,所以我创建了一个测试,它在虚拟组件中设置它:

describe('RightsDirective', () => {

  let component: TestRightsDirectiveComponent;
  let fixture: ComponentFixture<TestRightsDirectiveComponent>;
  let userService: UserService;
  let parentElement: DebugElement;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [TestRightsDirectiveComponent, RightsDirective],
      providers: [UserService],
      imports: [HttpClientTestingModule]
    });
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(TestRightsDirectiveComponent);
    component = fixture.componentInstance;
    parentElement = fixture.debugElement.query(By.css('div'));
    userService = TestBed.get(UserService);
  });

  it('should remove elements when user has no rights to it', async(() => {
    spyOn(userService, 'hasAnyRights').and.returnValue(of(false));

    expect(parentElement.children.length).toEqual(0);
  }));

});

@Component({
  template: `<div> <span [checkRights]="['ADMIN']"> </span></div>`
})
class TestRightsDirectiveComponent {
}

现在,我知道它不起作用。我知道测试本身存在多个问题,它只是我要检查的一个例子。

我尝试过多次使用detectChanges,fakeAsync和tick()等等。我花了3个小时(这是我第一次测试指令,我对Angular本身很新)并检查了前4页google

我如何确保: - 在onInit开始之前,服务的响应是否被嘲笑? - 指令中的.subscribe()是否在测试期望之前完成? 还有其他我没有看到的问题吗?配置是否正确?

1 个答案:

答案 0 :(得分:0)

就您的单元测试文件而言,ngOnInit 在您明确命令它之前不会运行。生命周期挂钩不会像在正常组件加载中那样在测试文件中自动工作。