#javascript #typescript #mongoose #jestjs #nestjs
#javascript #typescript #mongoose #jestjs #nestjs
Вопрос:
У меня есть объект Person с собственным классом репозитория, который я хочу протестировать. Этот класс репозитория вводит модель Mongoose, как предложено в документах NestJS, примерно так:
@InjectModel(Person.name)
private model: Model<PersonModel>
И код, который я пытаюсь протестировать, является запросом, похожим на const res = await this.model.find().lean();
Однако моя проблема заключается в том, что когда дело доходит до тестирования запроса lean(), поскольку это цепная функция для поиска методов (). Я смог зайти так далеко, как мог, но когда дело доходит до издевательства, у меня возникают некоторые конфликты типов:
const modelMockObject = {
find: jest.fn(),
findOne: jest.fn(),
findOneAndUpdate: jest.fn(),
updateOne: jest.fn(),
};
// ...
let MockPersonModel: Model<PersonModel>;
beforeEach(async () => {
const mockModule: TestingModule = await Test.createTestingModule({
providers: [
...,
{
provide: getModelToken(Person.name),
useValue: modelMockObject,
},
],
}).compile();
MockPersonModel = mockModule.get<Model<PersonModel>>(
Person.name,
);
});
// ...
// Inside a describe/it test...
const personModel = new MockPersonModel({
name: 'etc'
});
jest.spyOn(MockPersonModel, 'findOne').mockReturnValueOnce({
lean: () => ({ exec: async () => personModel }),
});
Ошибка, о которой сообщает линтер personModel
(предпоследняя строка), заключается в следующем:
Type 'Promise<PersonModel>' is not assignable to type 'Promise<P>'.
Type 'PersonModel' is not assignable to type 'P'.
'P' could be instantiated with an arbitrary type which could be unrelated to 'PersonModel'.ts(2322)
index.d.ts(2100, 5): The expected type comes from the return type of this signature.
Большое спасибо за вашу помощь!
Ответ №1:
Может быть, слишком поздно для вас, но для следующего, кто тоже будет искать решения этой проблемы, как и я.
Вы можете просто использовать mockImplementation: например:
MockPersonModel.findOne.mockImplementationOnce(() => ({
lean: jest.fn().mockReturnValue(personModel),
}));
Вы можете проверить здесь для получения более подробной информации об этой реализации: