如何订阅和测试 Observable.of rxjs Angular 9

How to subscribe and test Observable.of rxjs Angular 9

我正在尝试测试一个 returns 可观察到 rxjs 的函数,但我无法以任何方式订阅它。 None 我试过的订阅方法有效。

"rxjs": "6.5.4","@angular/core": "9.0.1"

我要测试的功能:

isNameValid(c: AbstractControl) {
    const searchResult = this.roles.filter((elem: any) => elem.name?.toLowerCase() === c.value?.toLowerCase());

    if (searchResult.length > 0) {
      c.get('name')?.setErrors({ nameTaken: true });
      return of({ matchError: 'nameTaken' });
    }
    return of(true);
  }

测试:

it('should return invalid error if supplied name is taken', () => {
    const nameControl = new FormControl(mock[0].name);
    const isValid = component.isNameValid(nameControl);
    isValid.subscribe
      ({
        next: (result: any) => {
        console.log(result);
        },
        error: (err: any) => {
        console.log(err);
        },
        complete: () => {
        console.log('complete');
        }
        });
  });

订阅 isNameValid 返回的可观察对象的正确语法是什么?现在,使用粘贴的语法(或我尝试过的任何其他方法)我无法获得无错误的订阅方式。

我应该以不同的方式编写测试吗?

我得到的错误是:

Expected 2-3 arguments, but got 1.ts(2554)
Observable.d.ts(51, 39): An argument for 'error' was not provided.

我也试过:

isValid.subscribe(response => {console.log(response}) 给出了同样的错误。

似乎存在一些无法正确推断 return 值的 TypeScript 问题。

要解决此问题,请为 isNameValid 方法明确提供类型定义:

isNameValid(c: AbstractControl): Observable<boolean | { matchError: string }> {
  // ...
}

顺便说一句,您可以将对象传递给 subscribe(),这是完全有效的。