2016-11-03 53 views
1
失败

考虑一下这个功能:如何让逮住承诺开玩笑

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作为我想测试的东西。如果承诺总是解决,这个测试不应该通过。但它会!这是因为承诺的抓住实际上捕获了expect例外。

我的问题是:在承诺的then处理程序中发生错误时,如何在承诺的catch处理程序中发现错误?

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

回答

0

您需要创建一个失败的承诺,并且您需要在测试中返回承诺。请查看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'); 
     }) 

}) 
+0

感谢您的回答。我已经改变了这个问题,使之更加清晰。 – alisabzevari

+0

更新了答案,向您展示了两种解决方案 –

+0

对不起,我认为这并不重要;但是我在我的测试中无法获得承诺。我应该用回调测试一个函数。实施使用承诺。我改变了这个问题。 – alisabzevari