如何对 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】:

可以使用GETPOST 请求进行查询,而只能使用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 突变和查询:无法读取未定义的属性

嵌套资源上的 GraphQL 突变

应该如何对列表中的项目进行重新排序,并更新多个对象,如何使用 GraphQL 突变进行持久化?

如何修复 TypeError:在使用 bcryptjs 对 GraphQL 突变进行哈希密码期间无法读取未定义的属性“哈希”?