Я использую Node с TypeScript, TypeDI и Jest. Я создаю службы, которые зависят друг от друга, скажем:
@Service()
export class MainService{
constructor(private secondService: SecondService){}
public someMethod(someString: string) // implementation depends on secondService
}
@Service()
export class SecondService{
constructor(private thirdService: ThirdService){}
}
@Service()
export class ThirdService{
constructor(){}
}
Я хочу протестировать MainService, но для его создания мне нужно передать зависимость, а этой зависимости нужна другая зависимость. Я пытался сделать это так, это работает, но некрасиво:
const secondService = new SecondService(new ThirdService());
jest
.spyOn(secondService, "someMethod")
.mockImplementation((someString: string) => {
// do something
return something;
});
const mainService = new MainService(secondService);
// use mainService in tests
Конечно, создание нового экземпляра зависимости не всегда вариант, и определенно не вариант, когда у него много зависимостей.
Я думаю, это должно больше выглядеть:
const secondService = SomeMockFactory.create(SecondService);
, но я не могу найти способ создать макет при отключении зависимостей. Я пробовал использовать
const secondService = jest.genMockFromModule("path/to/second/service");
, но после попытки spyOn методов secondService TS выдает ошибку, что «someMethod» не является функцией. Что я упускаю / делаю не так? Нужна ли мне какая-нибудь другая библиотека, кроме Jest?