#node.js #typescript #jestjs #tsyringe
#node.js #typescript #jestjs #tsyringe
Вопрос:
Я разрабатываю приложение, используя внедрение зависимостей tsyringe
. Это пример службы, которая получает репозиторий как зависимость:
import { injectable, inject } from 'tsyringe'
import IAuthorsRepository from '@domains/authors/interfaces/IAuthorsRepository'
@injectable()
export default class ListAuthorsService {
constructor (
@inject('AuthorsRepository')
private authorsRepository: IAuthorsRepository
) {}
И контейнер зависимостей:
import { container } from 'tsyringe'
import IAuthorsRepository from '@domains/authors/interfaces/IAuthorsRepository'
import AuthorsRepository from '@domains/authors/infra/typeorm/repositories/AuthorsRepository'
container.registerSingleton<IAuthorsRepository>(
'AuthorsRepository',
AuthorsRepository
)
export default container
В тестах я не хочу использовать зависимости, зарегистрированные в контейнере, а вместо этого передавать макет экземпляра через параметр.
let authorsRepository: AuthorsRepositoryMock
let listAuthorsService: ListAuthorsService
describe('List Authors', () => {
beforeEach(() => {
authorsRepository = new AuthorsRepositoryMock()
listAuthorsService = new ListAuthorsService(authorsRepository)
})
Но я получаю следующую ошибку:
tsyringe требует полизаполнения reflect. Пожалуйста, добавьте «импорт»отражающих метаданных»» в верхнюю часть вашей точки входа.
Я подумал: «Возможно, мне потребуется импортировать пакет отражающих метаданных перед выполнением тестов». Итак, я создал jest.setup.ts
файл, который импортирует reflect-metadata
пакет. Но возникает другая ошибка:
Экземпляр репозитория каким-то образом не определен.
Я хотел бы спокойно запускать свои тесты.
Ответ №1:
Сначала создайте в корне вашего проекта an jest.setup.ts
.
В вашем jest.config.js
, найдите эту строку:
// A list of paths to modules that run some code to configure or set up the testing framework before each test
// setupFilesAfterEnv: [],
раскомментируйте и добавьте свой jest.setup.ts
путь к файлу.
// A list of paths to modules that run some code to configure or set up the testing framework before each test
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
Теперь импортируйте отражающие метаданные в jest.setup.ts
:
import 'reflect-metadata';
И снова запустите тесты.
Ответ №2:
Я столкнулся с той же проблемой здесь и, проведя рефакторинг теста, обнаружил, что сначала он должен импортировать зависимости, а затем класс сервиса, который будет тестироваться