【问题标题】:Jest does not continue after async method异步方法后玩笑不继续
【发布时间】:2022-02-16 02:04:17
【问题描述】:

我有一个由点击事件触发的异步方法,在该方法中我调用 API 然后处理响应,如下所示:

async confirmName () {
    const {name, description} = this.form;
    const [data, error] = await Pipelines.createPipeline({name, description});

    if (error) {
        console.error(error);
        this.serviceError = true;
        return false;
    }

    this.idPipelineCreated = data.pipeline_id;
    return true;
}

测试看起来像这样:

test("API success", async () => {
    const ConfirmNameBtn = wrapper.find(".form__submit-name");
    await ConfirmNameBtn.vm.$emit("click");

    const pipelinesApi = new Pipelines();
    jest.spyOn(pipelinesApi, "createPipeline").mockResolvedValue({pipeline_id: 100});

    const {name, description} = wrapper.vm.form;

    pipelinesApi.createPipeline().then(data => {
        expect(wrapper.vm.pipelineNameServiceError).toBe(false);

        wrapper.setData({
            idPipelineCreated: data.pipeline_id
        });

        expect(wrapper.vm.idPipelineCreated).toBe(data.pipeline_id)
    }).catch(() => {})

})

一个基本的类模拟:

export default class Pipelines {
    constructor () {}

    createPipeline () {}
}

我正在测试一个成功的 API 调用,并模拟返回一个已解决的承诺的 API 调用。问题是覆盖范围仅涵盖方法的前两行,而不是我分配 API 调用响应的部分。这是正确的方法吗?

编辑:

报道截图:

【问题讨论】:

    标签: vue.js unit-testing async-await jestjs


    【解决方案1】:

    不要混淆awaitthen/catch。除非您有非常特殊的情况,否则首选使用await(请参阅此answer)

    test("API success", async () => {
        const ConfirmNameBtn = wrapper.find(".form__submit-name");
        await ConfirmNameBtn.vm.$emit("click");
    
        const pipelinesApi = new Pipelines();
        jest.spyOn(pipelinesApi, "createPipeline").mockResolvedValue({pipeline_id: 100});
    
        const {name, description} = wrapper.vm.form;
        const data = await pipelinesApi.createPipeline();
    
        expect(wrapper.vm.pipelineNameServiceError).toBe(false);
    
        wrapper.setData({
            idPipelineCreated: data.pipeline_id
        });
    
        expect(wrapper.vm.idPipelineCreated).toBe(data.pipeline_id)
        expect(wrapper.vm.serviceError).toBe(false);
    })
    

    【讨论】:

    • 我已经改变了那一点,但仍然有同样的问题,只涉及表单的解构和 api 调用。
    • 你能出示覆盖率报告吗?
    • 我加了一张截图。
    • 不应该测试confirmName直接调用吗?
    • 你的意思是调用测试里面的方法?如果我这样做,它将触发真正的 API 调用,而不是模拟的。
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多