I have a service in NestJS I'm testing using @nestjs/testing
in Typescript. But one of the methods depends on another, I would like to mock out the dependent method for only one test, so I can't use the ES6 class mocking, as that would override the class I'm testing with a mock.
class UsersService {
findMany(ids) {
return ids.map(id => this.findOne(id));
}
findOne(id) {
return this.httpService.get(id);
}
}
I want to test both methods, but I want to mock findOne
only when I'm testing findMany
.
Thanks in advance.
I have a service in NestJS I'm testing using @nestjs/testing
in Typescript. But one of the methods depends on another, I would like to mock out the dependent method for only one test, so I can't use the ES6 class mocking, as that would override the class I'm testing with a mock.
class UsersService {
findMany(ids) {
return ids.map(id => this.findOne(id));
}
findOne(id) {
return this.httpService.get(id);
}
}
I want to test both methods, but I want to mock findOne
only when I'm testing findMany
.
Thanks in advance.
- 1 Don't.. Don't mock parts of the thing you're supposed to be testing. See e.g. stackoverflow./q/66738500/3001761. – jonrsharpe Commented Jan 16, 2022 at 22:13
1 Answer
Reset to default 3You want to use spying here. Look for 'spyOn' in this documentation: https://docs.nestjs./fundamentals/testing near the bottom.
Here's an example I tried to cook up that's related to your posted code:
test('findMany', () => {
const spy = new UsersService;
// Here's the key part ... you could replace that "awesome" with something appropriate
jest
.spyOn(spy, 'findOne')
.mockImplementation(() => "awesome");
// Just proving that the mocking worked, you can remove this
expect(spy.findOne()).toBe("awesome");
const ids = ["Dio", "Lemmy"];
expect(spy.findMany(ids)).toStrictEqual(["awesome", "awesome"])
});