【问题标题】:Jest, expect another asynchronous callback not to be called开玩笑,期待另一个异步回调不会被调用
【发布时间】:2020-10-01 03:25:09
【问题描述】:

我正在使用Jest框架进行测试,我知道我必须调用done()函数,每当异步测试完成时,像这样

it("should be executed", (done)=>{

    const callback = jest.fun(()=>{
        expect(callback).toHaveBeenCalled();
        done();
    })    

    someFakeStream$.subscribe(callback);
})

现在我有以下场景,我想确保我的回调只触发一次,即使事件触发多次,所以我有

it("should be executed", (done)=>{

    //I Want to ensure that this function invoces only once
    const callback = jest.fun(()=>{
        expect(callback).toHaveBeenCalled();
        done();
    })    

    someFakeStream$.subscribe(callback);

    someFakeStream$.next();
    someFakeStream$.next();
})

现在如果我让回调代码保持原样它不会起作用,因为完成函数将在第一次发射后被调用,我可以在这个方法上添加失败条件

 const callback = jest.fun(()=>{
        expect(callback).toHaveBeenCalled();
        if (callback.mock.calls.length > 1) { // This will call fail if it's invoked twice
        done.fail();
      }
    })   

但现在我没有调用done() 方法,所以我会遇到开玩笑超时异常。 我该如何解决这个问题?

【问题讨论】:

    标签: angular rxjs jestjs


    【解决方案1】:

    我不确定您是否真的需要在这里进行异步测试。如果流实际上是一个主题,那么next 调用将直接调用订阅回调。所以首先,我会完全删除 done 回调。

    expect 看起来也有点不对劲。通常,您希望将期望放在“表演”之后(遵循安排/表演/断言模型时)。所以我猜你的代码可以这样工作:

    describe('test', () => {
        it('should be executed', () => {
            const callback = jest.fn();
    
            someFakeStream$.subscribe(callback);
    
            someFakeStream$.next();
            someFakeStream$.next();
    
            expect(callback).toHaveBeenCalledTimes(1);
        });
    });
    

    不知道你如何实现你的回调只被上述流调用一次。

    如果您确实需要异步测试(针对超时、间隔或承诺),请在测试前安装一个假计时器:

    jest.useFakeTimers();
    

    把它放在你的期望之前:

    ...
    jest.runAllTimers();
    expect(callback).toHaveBeenCalledTimes(1);
    

    【讨论】:

    • 我使用 angular.io/api/core/EventEmitter 而不是 Subject 进行发射,所以它异步发射值。但是您的解决方案无论如何都有效 runAllTimers() 解决了一个问题,提前感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2018-08-14
    • 2022-06-29
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    相关资源
    最近更新 更多