Javascript 如何使用Jest测试Json.parse

Javascript 如何使用Jest测试Json.parse,javascript,typescript,jestjs,ts-jest,Javascript,Typescript,Jestjs,Ts Jest,我是个新手,我正在尝试测试异步等待。我试图介绍Json.Parse,它抛出了一个异常,如下所述 错误消息 SyntaxError: Unexpected token o in JSON at position 1 at JSON.parse (<anonymous>) 模拟数据 public get dataSourceServiceMock(): any = { return { myPromiseMethod: function () { r

我是个新手,我正在尝试测试异步等待。我试图介绍Json.Parse,它抛出了一个异常,如下所述

错误消息

SyntaxError: Unexpected token o in JSON at position 1
    at JSON.parse (<anonymous>)
模拟数据

public get dataSourceServiceMock(): any = {
  return {
    myPromiseMethod: function () {
        return Promise.resolve({
             selectedOrder: {
                earlierStartTime: '2/5/2020',
                __id: 'orderId123'
            },
            Collection: [{
                __id: 'b1order 1',
                resName: 'New recipe_V1.0',
                plannedQuantity: '3',
                resId: 'ns=6;s=4/ProjectData/1',
                actualQuantity: '1',
                description: 'batchDesc',
             }]
           });
       }
   }
}
测试套件

 public async callDataSourceCommand(dialogData: any, RecipeId: string) {

   const gridItems = await this.dataSourceService.myPromiseMethod(id, collection);
   this.updateGrid(JSON.parse(gridItems));

 }
 private updateGrid(gridItems: any) {}
it('1. Should execute ', async() => {

  const myDialogApp: DialogApp = TestBed.get(DialogApp);
  myDialogApp.selectedOrder = selectedOrder;
  myDialogApp.RecipeId = Recipe.__id;

  jest.spyOn(dataSourceServiceMock, 'myPromiseMethod');

  await myDialogApp.callDataSourceCommand(dialogData, RecipeId);

  expect(dataSourceServiceMock.myPromiseMethod).toHaveBeenCalled();
});

那么,您可以简单地将响应存根并按如下方式传递它

public get dataSourceServiceMock(): any = {
  return {
    myPromiseMethod: function () {
        return Promise.resolve(JSON.stringify({
             selectedOrder: {
                earlierStartTime: '2/5/2020',
                __id: 'orderId123'
            },
            Collection: [{
                __id: 'b1order 1',
                resName: 'New recipe_V1.0',
                plannedQuantity: '3',
                resId: 'ns=6;s=4/ProjectData/1',
                actualQuantity: '1',
                description: 'batchDesc',
             }]
           }));
       }
   }
}


希望这有帮助

以下是单元测试解决方案:

index.ts

类服务{
私有数据源服务;
构造函数(数据源服务){
this.dataSourceService=dataSourceService;
}
公共异步callDataSourceCommand(dialogData:any,RecipeId:string){
常量id='1';
常量集合=[];
const gridItems=wait this.dataSourceService.mypromisethod(id,collection);
this.updateGrid(JSON.parse(gridItems));
}
私有updateGrid(gridItems:any){}
}
出口{服务};
datasourceService.ts

类数据源服务{
公共myPromiseMethod(id,集合){
返回JSON.stringify({});
}
}
导出{DataSourceService};
index.test.ts

从“/”导入{Service};
描述('60446313',()=>{
它('should pass',async()=>{
const gridItemsMock=JSON.stringify({
所选顺序:{
早期开始时间:“2020年2月5日”,
__id:'orderId123',
},
收藏:[
{
__id:'B11订单',
resName:“新配方1.0版”,
计划数量:“3”,
resId:'ns=6;s=4/ProjectData/1',
实际数量:“1”,
描述:“batchDesc”,
},
],
});
常量数据源服务锁={
myPromiseMethod:jest.fn().mockResolvedValueOnce(gridItemsMock),
};
const parseSpy=jest.spyOn(JSON,'parse');
const service=新服务(dataSourceServiceMock);
wait service.callDataSourceCommand('dialogData','1');
expect(datasourceservicecemock.mypromisethod).toBeCalledWith('1',[]);
expect(parseSpy).toBeCalledWith(gridItemsMock);
});
});
单元测试结果和覆盖率报告:

PASS stackoverflow/60446313/index.test.ts
60446313
✓ 应通过(9ms)
----------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
----------|---------|----------|---------|---------|-------------------
所有文件| 100 | 100 | 100 | 100 |
index.ts | 100 | 100 | 100 | 100 |
----------|---------|----------|---------|---------|-------------------
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:4.509秒,估计6秒