0

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.

C0l0red
  • 13
  • 3
  • 1
    _Don't._. Don't mock parts of the thing you're supposed to be testing. See e.g. https://stackoverflow.com/q/66738500/3001761. – jonrsharpe Jan 16 '22 at 22:13

1 Answers1

0

You want to use spying here. Look for 'spyOn' in this documentation: https://docs.nestjs.com/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"])
});

Joe Vienneau
  • 46
  • 1
  • 5