Sunday, May 12, 2024
 Popular · Latest · Hot · Upcoming
91
rated 0 times [  92] [ 1]  / answers: 1 / hits: 5371  / 2 Years ago, sun, january 30, 2022, 12:00:00

I'm trying to write a unit test for my NestJS API, but I'm getting this TypeError: Cannot read property 'then' of undefined error when I try to simulate a method in my service class. Could you please explain what is wrong with my code ?


sercice:


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);
});
});
});
}

service.test:


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();
});

I don't know if this is helpful, but I put the beforeEach where I mock my save and findOne database functions.


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)
);
});

error trace


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

More From » typescript

 Answers
0

That is because save() is not an async function, Change it to this:


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

[#425] Monday, January 24, 2022, 2 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
miles

Total Points: 256
Total Questions: 111
Total Answers: 104

Location: Benin
Member since Fri, Mar 24, 2023
1 Year ago
;