使用模拟猫鼬模型进行Nestjs e2e测试

时间:2019-06-06 10:37:28

标签: mongoose jestjs e2e-testing nestjs supertest

我正在用supertest为我的NestJS +猫鼬应用程序编写端到端测试。我能够模拟find()delete()等猫鼬api。 但是使用猫鼬save() api,对于代码this.CatModel(CatObject),模拟无法正常工作。我没有用于测试系统的mongodb,所以我需要对其进行模拟。

cat.e2e-spec.ts

describe('cat apis', () => {
    let app: INestApplication;

    beforeAll(async () => {
    const module = await Test.createTestingModule({
        imports: [CatModule]
    })
    .overrideProvider(getModelToken('Cat'))
    .useValue(mockCatModel)
    .compile();

    app = module.createNestApplication();
      server = app.getHttpServer();
      await app.init();
    });

    it(`POST /cat `, async () => {
        return await request(server)
            .post('/cat')
            .send(newCatPayload)
            .set('Accept', 'application/json')
            .expect(201)
            .expect(({ body }) => {
                expect(body).toEqual(expectedResponse);
            });
    });
});

catModel.ts

export const mockCatModel = {
    find: (obj) => {
        return [catMock];
    },

    save : (cat) => {
        return cat;
    }
};

cat.service.ts

public async createCat(catObject: CreateCatDto, user): Promise<ICat> {
    const oCat = this.catModel(catObject);
    oCat.user = user;
    return await oCat.save();
}

this.catModel.find()可以正常工作,但是this.catModel()引发错误:         'this.catModel is not a function'

我在 catModel.ts 中尝试过,添加了以下功能,

function : (a) => {return a;}

但是没有用。如果有人知道如何嘲笑this.catModel(catObject),请提供帮助。

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用useClass而不是useValue

答案 1 :(得分:0)

您可以尝试。或者可以)

  let app: INestApplication;
  let testingModule: TestingModule;
  let spyService: CatsService;

  beforeEach(async () => {
    testingModule = await Test.createTestingModule({
      controllers: [CatsController],
      providers: [
        {
          provide: CatsService,
          useFactory: () => ({
            findAll: jest.fn((obj) => [catMock]),
            save: jest.fn((cat) => cat)
          }),
        },
      ],
    }).compile();

    spyService = testingModule.get(CatsService);

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