单元测试报错:Cannot read property 'map' of undefined 问题排查
单元测试报错:Cannot read property 'map' of undefined
我尝试对一个方法做单元测试,通过mock addressList来测试,但报错提示“Cannot read property 'map' of undefined”。
待测试方法
async paginate( user: User, options: IPaginationOptions, ): Promise<Pagination<AddressResponse>> { const pagination = await this.addressRepository.paginate(user, options); return new Pagination( await Promise.all( pagination.items.map(async (address) => new AddressResponse(address)), ), pagination.meta, pagination.links, ); }
问题现象
用console.log查看pagination变量时,控制台显示它是一个非空数组:
console.log addressList: [ Address {} ]
这是repository返回的数据。
测试代码
describe('AddressService', () => { let addressService: AddressService; const user = new User(); const addressList: Address[] = [new Address()]; console.log('addressList: ', addressList); beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ AddressService, { provide: getRepositoryToken(AddressRepository), useValue: { paginate: jest.fn().mockResolvedValue(addressList), create: jest.fn(), save: jest.fn(), findById: jest.fn(), findOne: jest.fn(), update: jest.fn(), delete: jest.fn(), }, }, ], }).compile(); addressService = module.get<AddressService>(AddressService); }); it('should be defined', () => { expect(addressService).toBeDefined(); }); describe('paginate', () => { it('should return an address list successfully', async () => { // Act const result = await addressService.paginate(user, { page: 1, limit: 10, }); // Assert expect(result).toEqual(addressList); }); }); });
问题分析与修复
核心问题
测试代码中mock的paginate方法返回的是纯数组addressList,但待测试方法里,pagination变量被期望是一个包含items、meta、links属性的分页对象。当调用pagination.items.map()时,因为pagination是数组,没有items属性,所以pagination.items为undefined,触发报错。
修复步骤
- 调整mock返回值结构,让它匹配
Pagination类型的要求:const mockPaginationResult = { items: addressList, meta: { page: 1, limit: 10, total: 1, totalPages: 1 }, // 按业务需求定义meta字段 links: { first: '/addresses?page=1&limit=10', last: '/addresses?page=1&limit=10', prev: null, next: null, } // 按业务需求定义links字段 }; - 更新mock的paginate方法,返回上述结构的对象:
paginate: jest.fn().mockResolvedValue(mockPaginationResult), - 修正测试断言,因为待测试方法返回的是
Pagination<AddressResponse>实例,不是原始数组:it('should return an address list successfully', async () => { // Act const result = await addressService.paginate(user, { page: 1, limit: 10, }); // Assert expect(result.items).toBeDefined(); expect(result.items.length).toBe(addressList.length); expect(result.meta).toEqual(mockPaginationResult.meta); expect(result.links).toEqual(mockPaginationResult.links); });
额外说明
你看到的console.log显示addressList: [ Address {} ],是因为mock的返回值就是这个数组,但待测试方法需要的是带items属性的分页对象,结构不匹配才导致了错误。
内容的提问来源于stack exchange,提问作者Lucifer's Heritage
相关产品推荐
相关产品推荐

