我试图通过在控制台上打印其返回值来测试模拟函数。 这是设置-
被嘲笑的服务(只是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'是空数组,而不是我的预期。
我在这里想念什么? 请让我知道是否可以提供更多信息。
答案 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();
});
})