如何将变量传递到 graphql/apollo 的 cy.request 中而不需要字符串插值

Bra*_*don 1 javascript string-interpolation apollo graphql cypress

目前,以下方法有效,但我知道这是不好的做法,我不想在将来因这种实现而遇到问题。

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
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

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

我这样写的原因是因为我不能使用react-apollo/ graphql-tag。我已经尝试过,但是graphql需要react-apollo将其包装在一个不适用于此 cypress 上下文的组件中。

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

Bra*_*don 5

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

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
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

我不知道我可以在主体中声明变量,如果我像平常一样构造查询/突变,它们就会毫无问题地传递。

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

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