在测试期间未使用模拟服务订阅组件

时间:2018-04-18 20:53:44

标签: angular rxjs angular-cli karma-jasmine

我有一个使用服务的组件,您可以想象,此服务是在另一个类中实现的。为了测试这个组件,我已经嘲笑了这个服务。基本上,这是我订阅服务的组件文件:

this.tokenManagerService.retrieveToken().subscribe(token => {
  const tokenRetrieved = JSON.parse(token);
  console.log(tokenRetrieved);
  if (tokenRetrieved.error) {
    this.error = tokenRetrieved.error;
}

这是我模拟服务的组件的测试配置:

beforeEach(() => {
  tokenManagerServiceMock = new TokenManagerServiceMock();
  TestBed.configureTestingModule({
    declarations: [ AuthenticationComponent ],
    imports: [ FormsModule, HttpModule,RouterTestingModule.withRoutes([]) ],
    providers: [
      { provide: TokenManagerService, useValue: tokenManagerServiceMock }
    ]
  });
  TestBed.overrideComponent(AuthenticationComponent, {
  set: {
    providers: [
      { provide: TokenManagerService, useValue: tokenManagerServiceMock }
    ]
  }
});

这是我的考验:

it('should detect white field message', () => {
  fixture.whenStable().then(() => {
    inputEmail.nativeElement.value = faker.internet.email();
    inputEmail.nativeElement.dispatchEvent(new Event('input'));
    inputPassword.nativeElement.value = faker.internet.password();
    inputPassword.nativeElement.dispatchEvent(new Event('input'));
    loginButton.click();
    fixture.detectChanges();
  });
});

当执行loginButton.click()时,它应该触发onSubmit中的输入,这实际上正在发生。但为什么subscribe方法没有被执行?

O BS:这是组件订阅的模拟服务的方法:

public retrieveToken(): Observable<string> {
  return this.subject.asObservable();
}

编辑: @picciano建议此主题已在此issue中解决。但实际上,不是。我非常确定代码调用onSubmit中的方法,只是不调用使用subscribe的方法,而在另一个主题中,他想知道方法是否被调用。此外,正在订阅的方法正在执行,我已在其中打印。

1 个答案:

答案 0 :(得分:-1)

一般情况下,如果您正在使用whenStable(),则应使用async()进行换行:https://codecraft.tv/courses/angular/unit-testing/asynchronous/#_code_async_code_and_code_whenstable_code