You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单元测试报错: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,触发报错。

修复步骤

  1. 调整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字段
    };
    
  2. 更新mock的paginate方法,返回上述结构的对象:
    paginate: jest.fn().mockResolvedValue(mockPaginationResult),
    
  3. 修正测试断言,因为待测试方法返回的是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:55:20