我正在使用Jest&Spectator在Angular 9中工作,并尝试编写组件的单元测试。 问题在于,在ngOnInit()中,我有一个forkJoin对我的外观进行了一些调用,然后在订阅中,将返回的值分配给正确的变量。
运行测试时,出现此错误:
TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
81 | myData1: this.facade1.findThisThing(),
82 | myData2: this.facade2.findThatThing(),
> 83 | }).subscribe(data => {
| ^
84 | this.data1 = data.myData1.values;
85 | this.data2 = data.myData2.values;
我该如何模拟此订阅/处理?
组件:
ngOnInit(): void {
forkJoin({
myData1: this.facade1.findThisThing(),
myData2: this.facade2.findThatThing(),
}).subscribe(data => {
this.data1 = data.myData1.values;
this.data2 = data.myData2.values;
});
}
当我通过createComponentFactory方法创建组件时,我想可能是将其放置在provider.array中的component.spec中,但这似乎无济于事。
component.spec:
const createComponent = createComponentFactory<ComponentUnderTest>(
{
component: ComponentUnderTest,
mocks: [
...
]
providers: [
{
provide: 'subscribe',
useValue: jest.fn()
}
],
shallow: true,
},
);
任何帮助将不胜感激。
非常感谢Stack Overflow社区!
答案 0 :(得分:2)
问题实际上不是订阅语句本身。您想要做的是模拟服务,因此模拟在forkJoin内部使用的函数的返回值。请注意,rxjs尽可能同步,因此如果您返回使用of
运算符创建的Observable,则它是完全同步的。因此,您可以模拟该函数并利用of
运算符返回一个可观察的结果。
您遇到的问题实际上正在发生,因为传递给forkJoin的函数之一正在返回undefined
。请注意,如果您利用茉莉花间谍程序来模拟Angular服务,如果您未指定函数的返回值,则说明您正在监视,它将返回未定义的。
答案 1 :(得分:0)
了解间谍程序并在forkjoin中模拟这两个方法。 像
spyOn(this.facade1.findThisThing).. returnValue(of());
与secondMethod相同。