如何对 express-graphql 突变进行单元测试?
Posted
技术标签:
【中文标题】如何对 express-graphql 突变进行单元测试?【英文标题】:How to unit test express-graphql mutations? 【发布时间】:2018-04-02 23:54:56 【问题描述】:我有一个带有查询和突变的 Express-GraphQL API,它在 GraphiQL 中工作,查询的单元测试有效,但是突变的单元测试返回 405 错误。 我的 GraphQL 架构如下:
type Subject
type: String
type Category
name: String
type SubjectCategories
subject: Subject
categories: [Category]
type Query
subjectCategories(subjectType: String!): SubjectCategories
type Mutation
addSubjectCategory(subjectType: String! categoryName: String!): SubjectCategories
为了简化这个问题,这些方法的实现只是回显:
echoGetSubjectCategory(subjectType, context)
const subject = new Subject(subjectType);
const category = new Category("blah");
const retval =
subject,
categories: [category],
;
return retval;
echoMutateSubjectCategory(subjectType, categoryName, context)
const subject = new Subject(subjectType);
const category = new Category(categoryName);
const retval =
subject,
categories: [category],
;
return retval;
通过 Graphiql,一切正常:
mutation
addSubjectCategory(subjectType: "s1" categoryName: "c1")
subject
type
categories
name
产量
"data":
"addSubjectCategory":
"subject":
"type": "s1"
,
"categories": [
"name": "c1"
]
和
subjectCategories(subjectType: "s1")
subject
type
categories
name
效果相同。
在我的 API 单元测试中(使用来自 'supertest-as-promised' 的请求),查询返回 200
const req = request(app)
.get('/graphql')
.set('Content-Type', 'application/json')
.set('Accept', 'application/json')
.send(JSON.stringify(
query: "query subjectCategories(subjectType: \"categorized\" ) subject type categories name ",
));
const res = await req;
expect(res.statusCode).toBe(200);
但是这个测试失败:
const req = request(app)
.get('/graphql')
.set('Content-Type', 'application/json')
.set('Accept', 'application/json')
.send(JSON.stringify(
query: "mutation addSubjectCategory(subjectType: \"categorized\" categoryName: \"Politics\" ) subject type categories name ",
));
const res = await req;
expect(res.statusCode).toBe(200);
突变返回 405 错误信息非常不透明:
Expected value to be (using ===):
200
Received:
405
at Object.<anonymous> (test/api.test.js:171:28)
at Generator.next (<anonymous>)
at step (test/api.test.js:7:368)
at test/api.test.js:7:528
at <anonymous>
那么我怎样才能形成这个 json 有效负载以使 express-graphql 的这个单元测试通过?
【问题讨论】:
【参考方案1】:可以使用GET
和POST
请求进行查询,而只能使用POST
请求进行突变。
像这样修改你的代码,它应该可以工作:
const req = request(app)
.post('/graphql')
.set('Content-Type', 'application/json')
.set('Accept', 'application/json')
.send(
query: "mutation addSubjectCategory(subjectType: \"categorized\" categoryName: \"Politics\" ) subject type categories name "
);
const res = await req;
expect(res.statusCode).toBe(200);
【讨论】:
感谢您发布此代码 sn-p... 我已经完成了mutation: 'mutation....'
而不是 query: 'mutation .....'
>______
您还可以为查询属性传递字符串文字,这样您就不必转义任何引号(反逗号)。
你是救生员!以上是关于如何对 express-graphql 突变进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章
Graphql 突变查询不适用于 express-graphql
使用 Express-GraphQL 和 React-Apollo 订阅 GraphQL
应该如何对列表中的项目进行重新排序,并更新多个对象,如何使用 GraphQL 突变进行持久化?
如何修复 TypeError:在使用 bcryptjs 对 GraphQL 突变进行哈希密码期间无法读取未定义的属性“哈希”?