【问题标题】:How to make catched promises fail in jest如何使被捕获的承诺开玩笑地失败
【发布时间】:2017-03-17 01:38:50
【问题描述】:

考虑这个函数:

aPromise = require('axios');    
function middleware(callback) {
  axios.get('/api/get')
    .then(callback)
    .catch(callback);
}

考虑这个测试:

const callback = (err) => {
  expect(isError(err)).toBe(true);
  done();
};

middleware(callback);

isError 是一个 lodash 函数。

aPromise 视为我想要测试的东西。如果 Promise 总是解决,这个测试不应该通过。但它会的!那是因为 promise 的 catch 实际上捕获了 expect 异常。

我的问题是:当expect 在promise 的then 处理程序中抛出错误时,如何不捕获promise 的catch 处理程序中的错误?

请注意,我不使用 async/await。

【问题讨论】:

    标签: javascript jasmine jestjs


    【解决方案1】:

    您需要创建一个失败的 Promise,并且需要在测试中返回该 Promise。请查看doc on testing promises

    aPromise = require('axios');    
    jest.mock('axios', () => {
      get: ()=> jest.fn() //initialy mock the get function
    })
    
    it('catch failing promises',() = > {
        const result  = Promise.reject('someError'); //create a rejected promises
        aPromise.get.mockImplementation(() => result)// let `get` return the rejected promise
        const callback = jest.fn()
        middleware(callback)
    
        return result
            .then (()=>{
              expect(callback).toHaveBeenCalledWith('someError');
            })
    
    })
    

    【讨论】:

    • 感谢您的回答。我已更改问题以使其更清楚。
    • 对不起,我以为不重要;但我无法在我的测试中获得承诺。我应该用回调测试一个函数。该实现使用了一个承诺。我已经改变了问题。
    • 那么你要么需要从你的函数中返回promise,要么你需要模拟promise的创建。
    • 我不能返回承诺,但我可以模拟承诺。你能修改你的答案吗?
    • 那你需要先修改问题;),所以我可以看看你是如何将aPromise 输入到你的模块中的
    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 2021-03-16
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多