【问题标题】:how to use jest's .toHaveBeenCalledWith() with a matcher [duplicate]如何将 jest 的 .toHaveBeenCalledWith() 与匹配器一起使用 [重复]
【发布时间】:2021-04-02 08:35:48
【问题描述】:

我一直在向 React 项目添加测试,当我使用 toHaveBeenCalledWith 方法时,我一直受到轻微语法错误的困扰。我实际上并不关心语法是否完全正确,我只是想确保它包含所需的消息。

it("catches the error if network error occurs", async () => {        
        let errorMessage = "There has been a network error";
        mockAxios.post.mockImplementationOnce(() => Promise.reject(new Error(errorMessage)))
        
        snackbarSetter = jest.fn()
        const service2 = new ReleaseFormService();
        await service2.addReleases(releasesURL, releasesBody, headers, pushNewReleases, toggleLoading, snackbarSetter);

        expect(snackbarSetter).toHaveBeenCalledTimes(1)
        expect(snackbarSetter).toHaveBeenCalledWith(['Error :' + errorMessage], "error")
    })

此测试失败并显示消息 -

 Expected: ["Error :There has been a network error"], "error"
 Received: [Error: There has been a network error], "error"

这是单元测试第三次大部分成功但由于微小差异而失败。所以现在我正在寻找使用精确语法的方法,但到目前为止,我将 stringContaining 方法与 HaveBeenCalledWith 结合起来的努力没有结果。

有什么建议吗?需要明确的是,我不需要帮助完成这个我已经重构以通过的特定测试,而是为了节省未来测试的时间。

【问题讨论】:

  • 您是否尝试将抛出的Error 对象作为prop 传递给snackbarSetter?
  • 不是包含字符串的数组,而是实际错误对象的表示方式。
  • 使用正则表达式匹配消息。

标签: reactjs jestjs


【解决方案1】:

经过大量搜索和实验,我得出的结论是,无法将 Regex 或 Matchers 与 jest 的 .toHaveBeenCalledWith() 函数结合使用。

【讨论】:

    【解决方案2】:

    我假设在这种情况下您只需要错误消息,可能是这样的

    let error =""
    
    try{
      throw new Error("something")
    } catch (e) {
       error = e.message
    }
    
    snackbarSetter(error)
    

    那么你就可以这样断言了。

    expect(snackbarSetter).toHaveBeenCalledWith(`Error : ${errorMessage}`, "error")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      相关资源
      最近更新 更多