#typescript #backend #nestjs
#typescript #серверная часть #nestjs
Вопрос:
Я создал новый модуль и службу для приложения Nest, у него есть циклическая зависимость, которая успешно разрешается при запуске приложения, но когда я запускаю тесты, мой mockedModule (TestingModule) не может разрешить зависимость для новой созданной мной службы.
Пример «LimitsService», созданного с циклической зависимостью с помощью «MathService»:
@Injectable()
export class LimitsService {
constructor(
private readonly listService: ListService,
@Inject(forwardRef(() => MathService))
private readonly mathService: MathService,
) {}
async verifyLimit(
user: User,
listId: string,
): Promise<void> {
...
this.mathService.doSomething()
}
async someOtherMethod(){...}
}
MathService вызывает LimitService.SomeOtherMethod в одном из своих методов.
Вот как настроен модуль тестирования для «MathService» (раньше все работало нормально без «LimitsService»):
const limitsServiceMock = {
verifyLimit: jest.fn(),
someOtherMethod: jest.fn()
};
const listServiceMock = {
verifyLimit: jest.fn(),
someOtherMethod: jest.fn()
};
describe('Math Service', () => {
let mathService: MathService;
let limitsService: LimitsService;
let listService: ListService;
let httpService: HttpService;
beforeEach(async () => {
const mockModule: TestingModule = await Test.createTestingModule({
imports: [HttpModule],
providers: [
MathService,
ConfigService,
{
provide: LimitsService,
useValue: limitsServiceMock
},
{
provide: ListService,
useValue: listServiceMock
},
],
}).compile();
httpService = mockModule.get(HttpService);
limitsService = mockModule.get(LimitsService);
listService = mockModule.get(ListService);
mathService= mockModule.get(MathService);
});
...tests
Но когда я запускаю тестовый файл, я получаю:
«Nest не может разрешить зависимости MathService (…). Пожалуйста, убедитесь, что зависимость аргумента по индексу [x] доступна в контексте RootTestModule «.
Я попытался прокомментировать «mathService» из «LimitsService», и это работает, когда я это делаю, но мне нужен mathService.
Я также попытался импортировать «LimitsModule» вместо предоставления «LimitsService» с помощью forwardRef(), а затем получить «LimitsService» из mockModule, но это вызвало ту же ошибку.
Каков правильный способ импорта моего «LimitsService» в mockModule?
Комментарии:
1. Кажется, что LimitsService требует двух зависимостей, то есть ListService и MathService. Однако в вашем коде вы не предоставляете ListService в качестве поставщиков. Возможно, вы можете добавить ListService в свой список поставщиков и повторить попытку.
2. Моя ошибка, когда я добавил пример, в моем коде у меня есть ListService, указанный в качестве поставщика
Ответ №1:
Теперь это работает у меня.
РЕШЕНИЕ
Импортируйте шутливый макет LimitsService
jest.mock('@Limits/limits.service');
Установите поставщика с макетом
describe('Math Service', () => {
let mockLimitsService : LimitsService;
let mathService: MathService;
let listService: ListService;
let httpService: HttpService;
beforeEach(async () => {
const mockModule: TestingModule = await Test.createTestingModule({
imports: [HttpModule],
providers: [
MathService,
ConfigService,
LimitsService,
{
provide: ListService,
useValue: listServiceMock
},
],
}).compile();
mockLimitsService = mockModule.get(LimitsService);
httpService = mockModule.get(HttpService);
listService = mockModule.get(ListService);
mathService= mockModule.get(MathService);
});
Комментарии:
1. Эй, я столкнулся с той же проблемой! Где все же определен listServiceMock?
2. Эй, это было бы определено как:
const listServiceMock = { verifyLimit: jest.fn(), someOtherMethod: jest.fn() };