如何在没有字符串插值的情况下将变量传递到cy.request for graphql / apollo

问题描述

当前,下面的方法有效,但是我知道这是一种不好的做法,并且我不想由于此实现而在将来遇到问题。

export const loginQuery = ({ email,password }) => `
  mutation login {
    login(email: "${email}",password: "${password}") {
      authToken
    }
  }
`;

export default ({ url,method,userPath }) => {
  cy.fixture(userPath).then(res => {
    const query = loginQuery(res);
    cy.request({
      method,url,headers: { 'Content-Type': 'application/json' },body: { query },failOnStatusCode: false
    });
  });
};

如何正常传递变量,而不是通过字符串插值手动传递变量?

之所以这样写是因为我不能使用react-apollo / graphql-tag。我已经尝试过,但是graphqlreact-apollo需要包装在不适用于此柏树上下文的组件中。

注意:上面的实现不适用于对象/数组。我将需要手动传递突变中写出的对象内的特定键,而不仅仅是代表整个对象的变量。这显然是一个问题。

解决方法

该解决方案比预期的容易得多。不幸的是,我在网上没有看到任何示例,但是效果很好。

export const loginQuery = `
  mutation login($email: String!,$password: String!) {
    login(email: $email,password: $password) {
      authToken
    }
  }
`;

export default ({ url,method,userPath }) => {
  cy.fixture(userPath).then(res => {
    cy.request({
      method,url,headers: { 'Content-Type': 'application/json' },body: { query: loginQuery,variables: res },failOnStatusCode: false
    });
  });
};

我不知道我可以只在主体中声明变量,如果我像往常一样构造查询/变异,它们将毫无问题地传入。

最接近我成功解决方案的是要点https://gist.github.com/yusinto/30bba51b6f903c1b67e0383f4a288269。但是,要点仍然使用字符串插值。看起来他只需设置变量就可以简化其要旨。

这个要点是通过@xadm的建议搜索字符串SO for mutations using fetch/curl/etc

找到的