【问题标题】:TypeError: Cannot read property 'then' of undefined Jest and NestTypeError:无法读取未定义的 Jest 和 Nest 的属性“then”
【发布时间】:2022-01-31 13:00:32
【问题描述】:

我正在尝试为我的 NestJS API 编写一个单元测试,但是当我尝试在我的服务类中模拟一个方法时,我收到了这个 TypeError: Cannot read property 'then' of undefined 错误。你能解释一下我的代码有什么问题吗?

服务:

async userExist(data: User): Promise<boolean> {
    return new Promise((resolve, reject) => {
      this.usereRepository
        .findOne({
          where: {
            name: data.name,
          },
        })
        .then((res) => {
          if (!res) {
            resolve(false);
          }
          resolve(true);
        })
        .catch((err) => {
          reject(err);
        });
    });
  }

async createUser(data: User): Promise<User> {
    return new Promise((resolve, reject) => {
      this.userExist(data).then((exist) => {
        if (exist) {
          return reject('User already exist');
        }
        this.userRepository
          .save(data)
          .then((res) => {
            resolve(res);
          })
          .catch((err) => {
            reject(err);
          });
      });
    });
  }

服务测试:

it('should create a new user without error', async () => {
      jest
        .spyOn(service, 'userExist')
        .mockImplementation(() => Promise.resolve(false));
      await service.createUser(data);
      expect(userRepository.save).toHaveBeenCalled();
});

我不知道这是否有帮助,但我将 beforeEach 放在我模拟 savefindOne 数据库函数的地方。

let service: UserService;
let userRepository: Repository<User>;
beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        UserService,
        {
          provide: getRepositoryToken(User),
          useValue: {
            save: jest.fn(),
            findOne: jest.fn(),
          },
        },
      ],
    }).compile();
    service = module.get<UserService>(UserService);
    userRepository = module.get<Repository<User>>(
      getRepositoryToken(User)
    );
  });

错误跟踪

TypeError: Cannot read property 'then' of undefined

      64 |         if (exist) {
      65 |           return reject('User already exist');
    > 66 |         }
         |          ^
      67 |         this.userRepository
      68 |           .save(data)
      69 |           .then((res) => {

【问题讨论】:

  • 哪个then 给出了错误?
  • 你好@possum,我正在编辑我的消息
  • 你能发布service 在你的测试中是如何声明的吗?
  • 我更新了我在测试中声明 service 的消息

标签: javascript typescript jestjs nestjs


【解决方案1】:

那是因为save()不是异步函数,改成这样:

        {
          provide: getRepositoryToken(User),
          useValue: {
            save: jest.fn().mockResolvedValue('user_object'),
            findOne:jest.fn().mockResolvedValue('user_object'),
          },
        },

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-19
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2014-11-29
    • 2016-09-20
    相关资源
    最近更新 更多