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

Jest单元测试报错求助:UsersController测试失败排查

NestJS Jest单元测试:UsersController测试失败问题

我用Jest为NestJS项目编写单元测试,其余测试文件均已通过,但users.controller.spec.ts文件出现测试失败,先后遇到两个问题:

  • 初始错误:should create a user测试用例中,expect(received).toEqual(expected)深度相等校验失败,预期为用户对象,实际收到Promise对象。
  • 改用async/await修复Promise问题后,新错误:should create测试用例中,预期用户对象,实际收到字符串"user created successfully"。

以下是详细报错日志、新旧版本users.controller.spec.ts代码及user.service.spec.ts代码:

初始报错日志

PASS  src/app.controller.spec.ts (10.482 s)
PASS  src/users/services/users.service.spec.ts (11.629 s)
FAIL  src/users/controllers/users.controller.spec.ts (12.239 s)
  ● UsersController › should create a user

    expect(received).toEqual(expected) // deep equality

    - Expected  - 5
    + Received  + 1

    - Object {
    -   "birthDate": 2000-06-07T00:00:00.000Z,
    -   "email": "xs@gsuj.lk",
    -   "name": "aqs",
    - }
    + Promise {}

      45 |   it('should create a user' , () =>{
      46 |     const dto ={id:2, name:'aqs',birthDate: new Date('2000-06-07'), email : "xs@gsuj.lk" };
    > 47 |     expect(controller.create(dto)).toEqual({
         |                                    ^
      48 |
      49 |       name:dto.name,
      50 |       birthDate :dto.birthDate,

      at Object.<anonymous> (src/users/controllers/users.controller.spec.ts:47:36)

新报错日志

PASS  src/app.controller.spec.ts (10.573 s)
PASS  src/users/services/users.service.spec.ts (11.867 s)
FAIL  src/users/controllers/users.controller.spec.ts (12.282 s)
  ● UsersController › should create

    expect(received).toEqual(expected) // deep equality

    Expected: {"birthDate": 2000-06-07T00:00:00.000Z, "email": "xs@gsuj.lk", "id": 2, "name": "aqs"}
    Received: "user created successfully"

      62 |     const data = await controller.create(dto);
      63 |
    > 64 |          expect(data).toEqual({
         |                       ^
      65 |           id:2, name:'aqs',birthDate: new Date('2000-06-07'), email : "xs@gsuj.lk"
      66 |          })
      67 |     expect(controller).toBeDefined();

      at src/users/controllers/users.controller.spec.ts:64:23
      at fulfilled (src/users/controllers/users.controller.spec.ts:5:58)

Test Suites: 2 failed, 2 passed, 4 total
Tests:       1 failed, 4 passed, 5 total

旧版users.controller.spec.ts

import { Test, TestingModule } from '@nestjs/testing';
import { UsersService } from '../services/users.service';
import { UsersController } from './users.controller';

describe('UsersController', () => {
  let controller: UsersController; 
  
   const mockUsersService ={
    create: jest.fn(dto => {
      return {
         
        ...dto
      };
    }),
    update:jest.fn((id,dto) =>({
      id,
      ...dto
    }))
   }

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [UsersController],
      providers:[UsersService],
    })
    .overrideProvider(UsersService)
    .useValue(mockUsersService)
    .compile();

    //get service module from user module
     controller = module.get<UsersController>(UsersController);
  });

  //check if service available
  it('should be defined', () => {
    expect(controller).toBeDefined();
  });

  // it('hould create a user', () => {
  //   expect(controller.create({name:'aqs'})).toEqual({

  //   });
  // });

  it('should create a user' , () =>{
    const dto ={id:2, name:'aqs',birthDate: new Date('2000-06-07'), email : "xs@gsuj.lk" };
    expect(controller.create(dto)).toEqual({
      id:dto.id,
      name:dto.name,
      birthDate :dto.birthDate,
      email : dto.email
    });

    expect(mockUsersService.create).toHaveBeenCalledWith(dto);
  });
})

新版users.controller.spec.ts

import { Test, TestingModule } from '@nestjs/testing';
import { UsersService } from '../services/users.service';
import { UsersController } from './users.controller';

describe('UsersController', () => {
  let controller: UsersController; 
  
   const mockUsersService ={
    create: jest.fn(dto => {
      return {
         
        ...dto
      };
    }),
    update:jest.fn((id,dto) =>({
      id,
      ...dto
    }))
   }

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [UsersController],
      providers:[UsersService],
    })
    .overrideProvider(UsersService)
    .useValue(mockUsersService)
    .compile();

    //get service module from user module
     controller = module.get<UsersController>(UsersController);
  });

  //check if service available
  it('should be defined', () => {
    expect(controller).toBeDefined();
  });

  // it('hould create a user', () => {
  //   expect(controller.create({name:'aqs'})).toEqual({

  //   });
  // });

  // it('should create a user' , () =>{
  //   const dto ={id:2, name:'aqs',birthDate: new Date('2000-06-07'), email : "xs@gsuj.lk" };

  //   expect(controller.create(dto)).toEqual({
  //     id:dto.id,
  //     name:dto.name,
  //     birthDate :dto.birthDate,
  //     email : dto.email
  //   });
  
  //   expect(mockUsersService.create).toHaveBeenCalledWith(dto);
  // });

  it('should create', async () => {

    const dto ={id:2, name:'aqs',birthDate: new Date('2000-06-07'), email : "xs@gsuj.lk" };

    const data = await controller.create(dto);
     
         expect(data).toEqual({ 
          id:2, name:'aqs',birthDate: new Date('2000-06-07'), email : "xs@gsuj.lk" 
         })
    expect(controller).toBeDefined();
  });
})

user.service.spec.ts

import { Test, TestingModule } from '@nestjs/testing';
import { getRepositoryToken } from '@nestjs/typeorm';
import { getRepository } from 'typeorm';
//import { UsersController } from '../controllers/users.controller';
import { UsersService } from './users.service';
import {User} from '../entities/user.entity'

describe('UsersService', () => {
  let service: UsersService;
//  let providers:UsersController;

const mockUsersRepository ={
  create:jest.fn().mockImplementation(dto =>dto),
  save:jest.fn().mockImplementation(user => Promise.resolve({id:2, ...user}))

}

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [UsersService, {
        provide:getRepositoryToken(User),
        useValue:mockUsersRepository,
      },
    ],
    }).compile();

    service = module.get<UsersService>(UsersService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });

  it('should be create a new user record and return that', async () => {
    expect( await service.create({id:2, name:'aqs',birthDate: new Date('2000-06-07'), email : "xs@gsuj.lk" })).toEqual({
      id:2, 
      name:'aqs',
      birthDate: new Date('2000-06-07'), 
      email : "xs@gsuj.lk" ,
    });
  });
});

内容的提问来源于stack exchange,提问作者thi_m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:45:58