簡體   English   中英

如何訂閱和測試 Observable.of rxjs Angular 9

[英]How to subscribe and test Observable.of rxjs Angular 9

我正在嘗試測試一個返回 rxjs observable 的函數,但我無法以任何方式訂閱它。 我嘗試過的訂閱方法都不起作用。

"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返回的 observable 的正確語法是什么? 現在,使用粘貼的語法(或我嘗試過的其他任何東西),我無法獲得無錯誤的訂閱方式。

我應該以不同的方式編寫測試嗎?

我得到的錯誤是:

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})給出了同樣的錯誤。

似乎有一些 TypeScript 問題無法正確推斷返回值。

要解決此問題,請為isNameValid方法明確提供類型定義:

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

順便說一句,您可以將對象傳遞給subscribe() ,這是完全有效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM