Как мне высмеять запрос Mongoose «lean ()» с помощью Jest и NestJS?

#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),
}));

 

Вы можете проверить здесь для получения более подробной информации об этой реализации:

мой простой тест