【问题标题】:How to test lasValueFrom response and don't get message:'no elements in sequence' name:'EmptyError'如何测试 lasValueFrom 响应并且不收到消息:“序列中没有元素”名称:“EmptyError”
【发布时间】:2023-04-02 21:03:01
【问题描述】:

我正在尝试测试 emptyBasket 方法,因为我将已弃用的 toPromise() 升级到 lastValueFrom() (rxjs 7.1.0),我只收到错误:

message:'no elements in sequence'
name:'EmptyError'

待测方法:

    emptyBasket(): Promise<void> {
    return lastValueFrom(this.shoppingClient.emptyBasket()).then(() => this.store.dispatch(new EmptyBasket()));
}

测试:

it('should call emptyBasket on shoppingClient', (done) => {
            mockStore.dispatch = jest.fn();
            shoppingClientMock.prototype.emptyBasket = jest.fn().mockReturnValue(of());

            service.emptyBasket().then(() => {
                expect(shoppingClientMock.prototype.emptyBasket).toHaveBeenCalledTimes(1);
                expect(mockStore.dispatch).toHaveBeenCalledTimes(1);
                expect(mockStore.dispatch).toHaveBeenCalledWith(new EmptyBasket());
                done();
            },
            (err) => { 
                console.log('error', err)
                done();
        }
            );
        });

有人知道如何解决这个问题吗?

非常感谢!

【问题讨论】:

    标签: angular rxjs jestjs


    【解决方案1】:

    我注意到的第一件事是这一行:

    shoppingClientMock.prototype.emptyBasket = jest.fn().mockReturnValue(of());
    

    当您只使用of() 时,就相当于使用EMPTY。换句话说,它只是发出complete 通知,仅此而已。但是,lastValueFrom() 返回一个 Promise,并且需要用一个值来解析 Promise(这是 RxJS Observales 和 Promises 之间的核心区别之一)。所以错误是正确的。

    您应该强制它返回一个值,例如 of(undefined)of(void 0),即使该值无关紧要。

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      相关资源
      最近更新 更多