【问题标题】:Testing GraphQL API测试 GraphQL API
【发布时间】:2017-10-10 18:56:49
【问题描述】:

我正在测试我的 GraphQL API,但我想稍微清理一下。值得注意的是,我使用chai-http 处理网络请求。这是我目前正在做的事情(有效):

let createUser = (()=> {
  return new Promise((resolve, reject) => {
    chai.request(server)
      .post('/api/graphql/')
      .set('content-type', 'application/json')
      .send({ 'query' : 
        'mutation users { \
          user : addUser(inputs: { \
            firstName: \"Test\", \
            lastName: \"User\", \
            email: \"test@test.com\", \
          }) { \
            id, \
            firstName \
          } \
        }'
      })
      .end((err, res) => {
        if (err) { reject(err) }
        let data = res.body.data;
        let user = data.user;
        resolve(user);
      })
  });
});

但是,我想稍微清理一下并执行以下操作:

let createUser = (() => {
  let newUser = {
    firstName: 'Test',
    lastName: 'User',
    email: 'test@test.com'
  };

  return new Promise((resolve, reject) => {
    chai.request(server)
      .post('/api/graphql/')
      .set('content-type', 'application/json')
      .send({ 'query' : 
        'mutation users { \
          user : addUser(inputs: ' + JSON.stringify(newUser) + ') { \
            id, \
            firstName \
          } \
        }'
      })
      .end((err, res) => {
        if (err) { reject(err) }
        let data = res.body.data;
        let user = data.user;
        resolve(user);
      })
  });
});

但是,这种放置对象输入的样式不起作用并返回错误的请求错误。以下是返回的错误对象的部分内容:

任何想法为什么这不起作用?提前致谢!

【问题讨论】:

    标签: node.js mocha.js chai graphql chai-http


    【解决方案1】:

    您的 JSON 输入似乎有问题。可能是您的换行符和引号的某种组合在服务器上无法正确解析。

    但是,我仍然不建议像在 GraphQL 查询中那样内联变量。你应该这样做:

    let createUser = (() => {
      let newUser = {
        firstName: 'Test',
        lastName: 'User',
        email: 'test@test.com'
      };
    
      return new Promise((resolve, reject) => {
        chai.request(server)
          .post('/api/graphql/')
          .set('content-type', 'application/json')
          .send({
            'query' : 'mutation users ($input: CreateUserInput!) { \
              user : addUser(inputs: $input) { \
                id, \
                firstName \
              } \
            }',
            'variables' : {
               'input': newUser
             }
          })
          .end((err, res) => {
            if (err) { reject(err) }
            let data = res.body.data;
            let user = data.user;
            resolve(user);
          })
      });
    });
    

    您可以查看另一个 simple example here,了解如何在 Scaphold 上执行突变以创建一个拆分出 queryvariables 的用户。

    希望这会有所帮助!

    【讨论】:

    • 谢谢老哥,试试看! @vince
    • 嘿@vince,无论如何要清理我想要返回的响应?假设我想在创建后返回 id、firstName、lastName、facebookUID、email 等?你怎么看?
    • 在这种情况下,您总是可以返回更多字段。目前,查询返回idfirstName,但您也可以继续添加到该列表中,包括lastNamefacebookUIDemail 等。
    猜你喜欢
    • 2018-05-11
    • 2018-04-15
    • 2018-04-11
    • 2017-08-08
    • 2018-10-28
    • 2020-10-28
    • 2020-04-22
    • 1970-01-01
    • 2020-10-05
    相关资源
    最近更新 更多