我有一个使用服务的组件,您可以想象,此服务是在另一个类中实现的。为了测试这个组件,我已经嘲笑了这个服务。基本上,这是我订阅服务的组件文件:
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
的方法,而在另一个主题中,他想知道方法是否被调用。此外,正在订阅的方法正在执行,我已在其中打印。
答案 0 :(得分:-1)
一般情况下,如果您正在使用whenStable(),则应使用async()进行换行:https://codecraft.tv/courses/angular/unit-testing/asynchronous/#_code_async_code_and_code_whenstable_code