我在Angular 9中使用Jest & Spectator工作,并试图为一个组件编写单元测试.问题是,在我的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方法创建组件时,把它放在component.spec中的provider数组中,但这似乎没有帮助。
如果有任何帮助,我将非常感激。
const createComponent = createComponentFactory<ComponentUnderTest>(
{
component: ComponentUnderTest,
mocks: [
...
]
providers: [
{
provide: 'subscribe',
useValue: jest.fn()
}
],
shallow: true,
},
);
任何帮助都将是非常感激的。
非常感谢Stack Overflow社区
阅读关于在forkjoin.something里面监视和模拟你的两个方法的内容。
spyOn(this.facade1.findThisThing).and.returnValue(of())。
secondMethod也一样。
其实问题不在于subscribe语句本身,你要做的是嘲讽服务,从而嘲讽返回值。你要做的是嘲讽服务,从而嘲讽你在forkJoin里面使用的函数的返回值。请注意,rxjs是尽可能同步的,所以如果你想返回一个用 of
操作符,它是完全同步的。所以你可以对函数进行模拟,并返回一个利用 of
操作符。
你所面临的问题实际上是发生了,因为你传递给 forkJoin 的一个函数正在返回 undefined
. 如果你利用jasmine spy来嘲笑Angular服务,请注意,如果你没有指定一个函数的返回值,你正在监视的函数,它将返回未定义。