如何使用 Apollo Server 测试提供身份验证令牌的 GraphQL 查询?

Mar*_*vic 8 typescript jestjs graphql apollo-server

Apollo Server 集成测试文档展示了如何使用createTestClient以下命令测试简单查询:

const { query } = createTestClient(server);
const res = await query({ query: GET_LAUNCH, variables: { id: 1 } });
Run Code Online (Sandbox Code Playgroud)

在尝试测试需要授权令牌的查询时,我尝试将jwtToken作为额外字段传递给传递给查询的对象,如下所示:

const res = await query({ 
  query: MY_QUERY, 
  http: { headers: { authorization: `Bearer ${jwtToken}` } },
});
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用。尝试运行它时,我得到以下响应:

{
  "http": {
    "headers": {}
  },
  "errors": [{
    "message": "must authenticate",
    "locations": [{
      "line": 2,
      "column": 3
    }],
    "path": ["myQuery"],
    "extensions": {
      "code": "UNAUTHENTICATED"
    }
  }],
  "data": {
    "myQuery": null
  }
}
Run Code Online (Sandbox Code Playgroud)

知道如何正确测试需要授权令牌的查询吗?

使用:

  "devDependencies": {
    "jest": "^23.6.0",
    "apollo-server-testing": "^2.4.8"
  }
Run Code Online (Sandbox Code Playgroud)

Mik*_*ank 3

您可以为测试创建一个具有单独上下文的新服务器实例。像这样的东西(语法上可能不是 100% 正确,但你会明白的):

// Create a test user, no need to mess with JWT here, just create a plain object
// that resembles a user in your system.
const testUser = {
  id: 'testId',
  email: 'test@example.com',
};

// Use this for both test servers and real servers
export function getContext(models, viewer) {
  return {
    ...models,
    viewer,
  };
}

// Create test server
const testServer = new ApolloServer({
  typeDefs,
  resolvers,
  context: getContext({}, testUser),
});

const { query } = createTestClient(testServer);

// The actual server (you know better how this looks on your end, but just for
// the concept)
const realServer = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req, res }) => {
    const user = decodeUser(req.headers.authorization);

    return getContext({}, user);
  },
});
Run Code Online (Sandbox Code Playgroud)