【问题标题】:How to implement integration testing for guards in nest js?如何在nest js中实现守卫的集成测试?
【发布时间】:2019-10-06 16:21:51
【问题描述】:

我想使用nest js(Jest JS)对守卫进行单元测试。我找不到太多文档。

import {Test, TestingModule} from '@nestjs/testing';
import {CatsController} from '../src/modules/cats/cats.controller';
import {CatsService} from '../src/modules/cats/cats.service';
import {ICat} from '../src/modules/cats/interfaces/ICat';
import {JwtStrategy} from '../src/strategy/AppId.strategy';

  beforeEach(async () => {
     const module = await Test.createTestingModule({
             controllers: [CatsController],
             providers: [CatsService],
         }).compile();

    catsService = module.get<CatsService>(CatsService);
    catsController = module.get<CatsController>(CatsController);

  });
  describe('findAll', () => {
    it('should return an array of cats', async () => {
      // const appIdAuthContext: AppIDAuthToken = tokenInfo;
      const result: ICat = {
        name: 'test',
        age: 1,
        breed: 'one'
      };
      jest.spyOn(catsService, 'findAll').mockImplementation(() => result);
      console.log(result);
      console.log(catsController.findAll());
      expect(await catsController.findAll()).toBe(result);
    });
  });

上面的代码将返回猫的数组。我想为此单元测试实施警卫。

【问题讨论】:

标签: node.js angularjs jestjs nestjs


【解决方案1】:

我找到了一个实现。我正在分享示例,它可能对某人有所帮助

function createTestModule() {
      return Test.createTestingModule({
        imports: [
          PassportModule.register({defaultStrategy: 'jwt'}), CatsModule
        ],
        controllers: [
          AppController
        ],
        providers: [
          AppService, RoleGuard, JwtStrategy
        ],
        exports: [PassportModule]
      }).compile();
    }

beforeEach(async () => {
  const module = (await createTestModule(
    ));
  app = module.createNestApplication();
  server = app.getHttpServer();
  await app.init();
});

  it('Should create cat for admin', async () => {
    return await request(server)
        .post('/cats/createcat')
        .set('Authorization', catAdminToken)
        .set('Accept', 'application/json')
        .send(catDto)
        .expect(201);
  });

【讨论】:

  • 这不是单元测试,更像是集成/e2e 测试。请阅读martinfowler.com/articles/practical-test-pyramid.html 以了解不同类型的测试,并在此处查看 NestJs 单元测试示例docs.nestjs.com/fundamentals/testing#unit-testing
  • 在单元测试中,我们不实例化app模块。我们只是想测试控制器/服务来检查它们的基本功能。你所做的更像是一个 e2e 测试,我们在其中实例化一个测试应用程序。
  • 嘿,感谢您的回答,为我节省了很多时间!
猜你喜欢
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2018-05-08
相关资源
最近更新 更多