使用@Input 和服务可观察订阅进行组件单元测试
Component unit testing with @Input with service observable subscription
我尝试使用 combineLatest 测试(Jasmine/Karma)一个带有 @Input 的组件,该组件订阅了服务 Observable 并且它自己 属性 使用 combineLatest 并出现此错误:
*TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.*
我的代码如下所示:
服务
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class Service {
private _servicePropertySub = new BehaviorSubject<[]>([]);
public get servicePropertyObs (): Observable<[]> {
return this._servicePropertySub .asObservable();
}
}
组件
//...
@Component({
//...
})
export class MyComponent implements OnDestroy {
private _componentProp = BehaviorSubject<[]>([]);
public get componentPropObs (): Observable<[]> {
return this._componentProp.asObservable();
}
public sum = 0;
@Input()
public set myInput(value: V) {
if (v) {
combineLatest([
this.service.servicePropertyObs,
this.componentPropObs
]).subscribe(([one, two]) => {
this.sum = one + two;
});
}
}
constructor(private service: Service) {}
//...
Observables 中的数字仅适用于此示例。
我想用@Input 测试这个组件,但我总是有一个关于未定义(上面的错误)可观察到的错误。我想这是因为我为该服务创建了间谍。在这种情况下,应如何使用输入中的服务创建此测试?
好吧.. 我会尽量忽略您正在订阅输入 setter.. 并且此订阅甚至没有完成,从而造成严重的内存泄漏这一事实。您收到该错误的原因是因为您的间谍没有 servicePropertyObs
属性。更好的方法是只使用模拟提供者并将间谍附加到那里的任何东西。所以在你的测试代码中,你需要添加以下提供者:
{ provide: Service, useValue: { servicePropertyObs: of(1) } }
我尝试使用 combineLatest 测试(Jasmine/Karma)一个带有 @Input 的组件,该组件订阅了服务 Observable 并且它自己 属性 使用 combineLatest 并出现此错误:
*TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.*
我的代码如下所示:
服务
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class Service {
private _servicePropertySub = new BehaviorSubject<[]>([]);
public get servicePropertyObs (): Observable<[]> {
return this._servicePropertySub .asObservable();
}
}
组件
//...
@Component({
//...
})
export class MyComponent implements OnDestroy {
private _componentProp = BehaviorSubject<[]>([]);
public get componentPropObs (): Observable<[]> {
return this._componentProp.asObservable();
}
public sum = 0;
@Input()
public set myInput(value: V) {
if (v) {
combineLatest([
this.service.servicePropertyObs,
this.componentPropObs
]).subscribe(([one, two]) => {
this.sum = one + two;
});
}
}
constructor(private service: Service) {}
//...
Observables 中的数字仅适用于此示例。
我想用@Input 测试这个组件,但我总是有一个关于未定义(上面的错误)可观察到的错误。我想这是因为我为该服务创建了间谍。在这种情况下,应如何使用输入中的服务创建此测试?
好吧.. 我会尽量忽略您正在订阅输入 setter.. 并且此订阅甚至没有完成,从而造成严重的内存泄漏这一事实。您收到该错误的原因是因为您的间谍没有 servicePropertyObs
属性。更好的方法是只使用模拟提供者并将间谍附加到那里的任何东西。所以在你的测试代码中,你需要添加以下提供者:
{ provide: Service, useValue: { servicePropertyObs: of(1) } }