【发布时间】:2021-04-11 21:55:10
【问题描述】:
场景
-
LoginPageComponent期待用户输入。此输入是 6 个字符的键(短语)。 - 用户输入 8 个字符后,加载状态将设置为忙。加载完成后,状态将是成功或失败。
- 在失败状态下,会出现一条错误消息。
- 当密钥有效时,用户将被引导至仪表板。
我要测试什么?
- 加载时加载状态忙
- 加载失败时出现错误
-
AuthService只能使用 6 个字符长的键调用
我的问题是什么?
时间。
如何模拟满足我需求的输入(知道 debounceTime)?另外AuthService 需要一些异步时间来检查密钥,所以我不能直接断言。我也不能订阅可观察链,因为它不是公开的。
代码
export class LoginPage implements OnInit {
loadingState = LoaderState.None;
message: string;
form: FormGroup = this.formBuilder.group({ key: '' });
constructor(
private authService: AuthService,
private formBuilder: FormBuilder
) {}
ngOnInit(): void {
this.form.get('key')?.valueChanges.pipe(
tap(() => (this.loadingState = LoaderState.None)),
debounceTime(350),
filter((key: string) => key.length === 8),
tap(() => (this.loadingState = LoaderState.Loading)),
switchMap((key: string) =>
of(key).pipe(
switchMap(() => this.authService.authenticate(key)),
catchError((error) => this.handleErrorStatusCode(error))
)
),
tap(() => (this.loadingState = LoaderState.Done))
)
.subscribe((_) => {
console.log('success'); //TODO: Navigate
});
}
private handleErrorStatusCode(error: any): Observable<never> {
this.loadingState = LoaderState.Failed;
// Set error logic...
return EMPTY;
}
}
【问题讨论】:
标签: angular unit-testing rxjs jasmine angular-reactive-forms