带有笑话和酶的模拟功能模块



我有一个 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);

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

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

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

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 
  })
})
})

请注意,您必须在模块顶部模拟它。否则,您将导入原始模块,稍后将模块替换为模拟模块,这将对导入的模块没有影响。将嘲笑视为开玩笑说如何解决导入的一种方式。因此,在导入后嘲笑某些东西将没有效果。

最新更新