测试一个玩笑的模拟功能本身

时间:2018-11-30 06:04:53

标签: reactjs jestjs enzyme

我试图通过在控制台上打印其返回值来测试模拟函数。 这是设置-

被嘲笑的服务(只是Fetch的副本)-

export default function FetchService(url){
return fetch(url);
}

这是我的模拟功能设置(在__mocks__文件夹中)-

const  posts= [
      { "id": 1, "Name": "pen", "Stock": "100" },
      { "id": 2, "Name": "pencil", "Stock": "150" }
    ]


export default  function FetchService(url){
return  new Promise((resolve)=>{
Promise.resolve(posts)
})
     }

因此,如果我的模拟功能正常工作,则promise应该会解析并始终返回2个对象的预定义数组,对吧?

记住这一点,我编写了以下测试用例-

jest.mock('./FetchService');
test('getting data',(done)=>{

    let returnedData=[];
    FetchService('').then((data)=>data.json()).then((dataP)=>{
        returnedData=dataP;     
    });

    setTimeout(()=>{console.log(returnedData);done();},2000);    
})

问题是,consoloe.log显示'returnedData'是空数组,而不是我的预期。

我在这里想念什么? 请让我知道是否可以提供更多信息。

1 个答案:

答案 0 :(得分:1)

首先,您的模拟永远不会解决,因为您不会调用传递的resolve回调,其次是模拟应使用json方法返回对象,该方法应返回promise:

export default  function FetchService(url) {
  const json = () => Promise.resolve( posts );
  return  new Promise( resolve => resolve({ json }));
}

此外,您可以直接在done()中调用.then(也许如果没有setTimeout就会更简单):

test('getting data',(done)=>{
  FetchService('')
    .then(data => data.json())
    .then(
      data => {
        expect(data).toHaveLength(2);
        done();     
  });
})
相关问题