Не удается прочитать свойство 'find' унаследованного метода в модульных тестах - PullRequest
0 голосов
/ 14 февраля 2020

У меня возникла проблема при попытке выполнить тест e2e для моего приложения Nest JS, которое использует mongodb-memory-server для запуска mon go в памяти

мой тест e2e выглядит следующим образом

describe('UsersController.e2e', () => {
  let app: INestApplication;
  let module: TestingModule;
  const mongod = new MongoMemoryServer();

  beforeAll(async () => {

    const port = await mongod.getPort();
    const database = await mongod.getDbName();

    module = await Test.createTestingModule({
      providers: [UserRepository, UserService],
      controllers: [UserController],
      imports: [TypeOrmModule.forRootAsync({
        useFactory: () => {
          return {
            type: 'mongodb',
            host: '127.0.0.1',
            port,
            database,
            entities: [__dirname + '../../../**/*.entity{.ts,.js}'],
          } as TypeOrmModuleOptions;
        },
      }),
        TypeOrmModule.forFeature([User])
      ]
    }).compile();

    app = module.createNestApplication();

    await app.init();
  });

  afterAll(async () => {
    await module.close();
    await app.close();
  });

  describe('GET /users', () => {
    it('should return a collection of user resources', async () => {

      const { body } = await supertest
        .agent(app.getHttpServer())
        .get('/users')
        .set('Accept', 'application/json')
        .expect('Content-Type', /json/)
        .expect(200);
      expect(body).toEqual(userCollectionMock);
    });
  });
});

при запуске теста выдает ошибку 500

Cannot read property 'find' of undefined
TypeError: Cannot read property 'find' of undefined
    at UserRepository.Object.<anonymous>.MongoRepository.find (src/repository/MongoRepository.ts:77:29)
    at UserRepository.index (src/modules/user/repositories/user.repository.ts:12:20)

класс репозитория выглядит как

export class UserRepository extends MongoRepository<User> implements IResourceRepository<User> {

  index(): Promise<User[]> {
    return this.find();
  }
}

расширение MongoRepository предоставляет find () https://github.com/typeorm/typeorm/blob/master/src/repository/MongoRepository.ts#L76

Так что меня озадачивает, почему оно не определено!

1 Ответ

0 голосов
/ 08 апреля 2020

Я знаю, что это месяц, но я только столкнулся с этой проблемой и решил ее.

Я использую mon goose + type goose с mongodb-memory-server.

import { MongoMemoryServer } from 'mongodb-memory-server';

describe('Auth', () => {
  let app: INestApplication;
  let mongoServer: MongoMemoryServer;

  beforeAll(async () => {
    // Set up database
    mongoServer = new MongoMemoryServer();
    const mongoUri = await mongoServer.getUri();

    const moduleRef = await Test.createTestingModule({
      imports: [
        ...
        TypegooseModule.forRoot(mongoUri, {
          useNewUrlParser: true,
          useUnifiedTopology: true,
        }),
        ...
      ],
      controllers: [...],
      providers: [...],
    }).compile();

    app = moduleRef.createNestApplication();
    await app.init();
  });

  afterAll(async () => {
    await mongoServer.stop();
  });
});

Основная ошибка, которую я сделал, заключалась в том, что я отдельно переписал свой тип ввода goose инъекция.

  providers: [
    // THIS WAS MY MISTAKE!
    {
      provide: getModelToken('User'),
      useValue: mockUserModel,
    },
  ],

Я знаю, что это не полный ответ на ваш вопрос, но я надеюсь, это поможет вам.

...