繁体   English   中英

TypeError:无法读取未定义的 Jest 和 Nest 的属性“then”

[英]TypeError: Cannot read property 'then' of undefined Jest and Nest

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

服务:

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) => {

那是因为save()不是async function,改成这样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM