首页 文章

具有开玩笑和酶的模拟功能模块

提问于
浏览
0

我有一个React组件,它从另一个模块调用一个方法 .
该模块只返回1个方法:

export default (url, method, authorization, body) => {
  const headers = { 'Content-Type': 'application/json' }
  if (authorization) headers.Authorization = localStorage.getItem('id_token');
  return fetch(url, {
    method,
    headers,
    body: JSON.stringify(body)
  }).then(res => res.json());
}

在使用它测试组件时,我会被调用 .
我是React / Jest / Enzyme的新手所以我可能会错过一些简单的东西 .

在我的测试文件中:

jest.mock('../../utils/fetch.js', () => () => {
  Promise.resolve({_id: 1});
});
import fetch from '../../utils/fetch';

使用方法的地方:

return fetch('/api/items', 'post', true, newItem).then(res => {
  this.props.history.push(`/items/${res._id}`);
}).catch(console.log);

1 回答

  • 1

    所以你有一个模块返回一个将返回一个promise的函数 . 如果您只想测试快乐路径,只需从模拟中返回已解决的承诺:

    jest.mock('./my-function.js', () => () => Promise.resolve('foo'));
    

    如果您需要在测试期间设置函数的结果,请使用 Spy 模拟模块,并在测试中稍后设置结果:

    jest.mock('./my-function.js', () => jest.fn());
    import myFunction from './my-function.js'
    describe('foo',()=>{
      it('the happy pass',()=> {
         myFunction.mockImplementation(() => Promise.resolve('foo'))
        //your assertion here 
      })
    
      it('when it fails',()=> {
         myFunction.mockImplementation(() => Promise.reject())
         //your assertion here 
      })
    })
    })
    

    请注意,您必须在模块顶部模拟它 . 否则你将导入原始文件,稍后用模拟替换模块,这对导入的模块没有影响 . 把嘲笑想象成一种说出如何解决导入的方式 . 所以在导入之后嘲笑某些东西将没有任何效果 .

相关问题