如何使用 GRAPHQL 测试 e2e Nestjs API

Posted

技术标签:

【中文标题】如何使用 GRAPHQL 测试 e2e Nestjs API【英文标题】:How Test e2e Nestjs API with GRAPHQL 【发布时间】:2020-10-28 20:23:58 【问题描述】:

当我通过 graphql-playground 创建我的所有者时,它工作正常, 但我的测试失败并回复我“body.data.createOwner 未定义”,没有数据。

// owner.e2e.spec.ts
describe('Owner test (e2e)', () => 
    let app: INestApplication;

    beforeAll(async () => 
        const moduleRef = await Test.createTestingModule(
            imports: [
                GraphQLModule.forRoot(
                    autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
                ),
                OwnerModule,
                DatabaseModule
            ]
        ).compile();
        app = moduleRef.createNestApplication();
        await app.init();
    );

    afterAll(async () => 
        await app.close();
    )

    const createOwnerQuery = `
           mutation createOwner($OwnerInput: OwnerInput!) 
            createOwner(ownerInput: $OwnerInput) 
              _id
              name
              firstname
              email
              password
              firstsub
              expsub
              createdAt
              updatedAt
            
          
    `;
   
    let id: string = '';

    it('createOwner', () => 
        return request(app.getHttpServer())
            .post('/graphql')
            .send(
                operationName: 'createOwner',
                variables: 
                   OwnerInput: 
                        name: 'adar',
                        firstname: 'adar',
                        email: 'adar@test.com',
                        password: 'testing',
                        firstsub: '2020-08-14',
                        expsub: '2020-07-13'
                    
                ,
                query: createOwnerQuery,
            )
            .expect(( body ) => 
                const data = body.data.createOwner <-- test fail at this line
                id = data._id
                expect(data.name).toBe(owner.name)
                expect(data.email).toBe(owner.email)
                expect(data.firstsub).toBe(owner.firstsub)
            )
            .expect(200)
    )
// Output terminal

 FAIL  test/owner.e2e-spec.ts (9.567 s)
  Owner test (e2e)
    ✕ createOwner (79 ms)

  ● Owner test (e2e) › createOwner

    TypeError: Cannot read property 'createOwner' of undefined

       98 |             )
       99 |             .expect(( body ) => 
    > 100 |                 const data = body.data.createOwner
          |                                        ^
      101 |                 id = data._id
      102 |                 expect(data.name).toBe(owner.name)
      103 |                 expect(data.email).toBe(owner.email)

      at owner.e2e-spec.ts:100:40
      at Test._assertFunction (../node_modules/supertest/lib/test.js:283:11)
      at Test.assert (../node_modules/supertest/lib/test.js:173:18)
      at Server.localAssert (../node_modules/supertest/lib/test.js:131:12)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        9.645 s, estimated 10 s
Ran all test suites.

【问题讨论】:

拥有一个模块还是整个应用程序? 这是一个模块(也是我的实体) 尝试只导入您的AppModule,它将包含正常运行您的应用程序所需的所有设置。 【参考方案1】:

我的问题来自 CLI 插件,它自动生成可为空的 Graphql 字段,而没有将 @Field 装饰器放在我的 ObjectType 中。

nest 的创建者就这个问题给出了一个技巧。

--> https://github.com/nestjs/graphql/issues/810

但这对我不起作用,所以我只是在我的模型@ObjectType() 中的所有属性中添加了“@Field”装饰器。

【讨论】:

以上是关于如何使用 GRAPHQL 测试 e2e Nestjs API的主要内容,如果未能解决你的问题,请参考以下文章

运行 e2e 测试时在 cypress 中模拟特定的 graphql 请求

elastic APM 和 NestJS 不区分 graphql 查询

使用 Polly JS 在 React Native 上拦截 Apollo/GraphQL 请求

如何在 nativescript-vue 中使用 e2e 或单元测试?

如何在angularjs e2e量角器测试中上传文件

如何使用多个 docker 设置 Gitlab CI E2E 测试