【问题标题】:How to subscribe and test Observable.of rxjs Angular 9如何订阅和测试 Observable.of rxjs Angular 9
【发布时间】:2020-03-16 14:31:16
【问题描述】:

我正在尝试测试一个返回 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}) 给出相同的错误。

【问题讨论】:

  • 你为什么要传递一个 object.subscribepositionally 最多需要三个回调吗(参见例如rxjs-dev.firebaseapp.com/api/index/interface/…)?什么错误?给minimal reproducible example
  • @jonrsharpe 我已经编辑了这个问题。这已经是一个最小的可重现示例。我想访问 observable 返回的值并最终比较它,但我无法正确获取订阅语法。
  • @jonrsharpe AFAIK,您可以将 Suscriber-Like 对象传递给它。您可以使用弹珠进行测试。见rxjs-dev.firebaseapp.com/guide/testing/marble-testing
  • 有了输出。 Expected 2-3 arguments, but got 1.ts(2554) - 你只传递一个对象(第一个示例)或函数(第二个)。如果传递 2-3 个参数会发生什么?
  • @Jota.Toledo 似乎如此,但这是 TypeScript 抱怨,所以我猜这些类型并没有反映这一点。

标签: angular rxjs karma-jasmine


【解决方案1】:

似乎有一些 TypeScript 问题无法正确推断返回值。

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

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

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

【讨论】:

  • 哇。哇。谢谢你。从来没想过。我已经在这很长时间了。这确实解决了问题。
猜你喜欢
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 2020-10-11
  • 2021-12-19
  • 2021-11-18
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多