角单元测试/模拟叉

时间:2020-05-22 21:12:00

标签: angular unit-testing rxjs fork-join

我正在使用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社区!

2 个答案:

答案 0 :(得分:2)

问题实际上不是订阅语句本身。您想要做的是模拟服务,因此模拟在forkJoin内部使用的函数的返回值。请注意,rxjs尽可能同步,因此如果您返回使用of运算符创建的Observable,则它是完全同步的。因此,您可以模拟该函数并利用of运算符返回一个可观察的结果。

您遇到的问题实际上正在发生,因为传递给forkJoin的函数之一正在返回undefined。请注意,如果您利用茉莉花间谍程序来模拟Angular服务,如果您未指定函数的返回值,则说明您正在监视,它将返回未定义的。

答案 1 :(得分:0)

了解间谍程序并在forkjoin中模拟这两个方法。 像

spyOn(this.facade1.findThisThing).. returnValue(of());

与secondMethod相同。