如何使用 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 请求