【发布时间】: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 给
.subscribe? positionally 最多需要三个回调吗(参见例如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