使用 Apollo Server (apollo-server) 上的 executeOperation 获取标头以进行集成测试

问题描述

自从弃用 apollo-server-testing 后,我使用新的方式与 apollo-server(包含在 apollo-server 2.25.0 中)进行集成测试。从变更 signin 中,我在 OutgoingMessage 标头(在 'Set-Cookie' 中)中设置了刷新令牌。

简化的解析器

    @Mutation(() => RefreshTokenOutput)
    async refreshToken(@Ctx() { response,contextRefreshToken }: Context): Promise<RefreshTokenOutput> {
        if (contextRefreshToken) {
            const { accesstoken,refreshToken } = await this.authService.refreshToken(contextRefreshToken);
            response.setHeader(
                'Set-Cookie',cookie.serialize('refreshToken',refreshToken,{
                    httpOnly: true,maxAge: maxAge,secure: true,})
            );
            return { accesstoken: accesstoken };
        } else {
            throw new AuthenticationError();
        }
    }

测试用例

            // given:
            const { user,clearPassword } = await userLoader.createuser16c();
            const input = new UserSignininput();
            input.email = user.email;
            input.password = clearPassword;

            const MUTATE_signin = gql`
                mutation signin($userInput: UserSigninInput!) {
                    signin(input: $userInput) {
                        accesstoken
                    }
                }
            `;

            // when:
            const res = await server.executeOperation(
                { query: MUTATE_signin,variables: { userInput: input },operationName: 'signin' },buildContext(user)
            );

我正在尝试测试此令牌是否设置正确且格式正确。您知道如何使用 executeOperation 访问此标头吗?

解决方法

server.executeOperation 调用 processGraphQLRequest

并且 processGraphQLRequest 返回类型是 GraphQLResponse

export interface GraphQLResponse {
  data?: Record<string,any> | null;
  errors?: ReadonlyArray<GraphQLFormattedError>;
  extensions?: Record<string,any>;
  http?: Pick<Response,'headers'> & Partial<Pick<Mutable<Response>,'status'>>;
}

我不确定,但我认为 GraphQLResponse.http 中的标头

你可以在github repo中找到调用结构。

https://github.com/apollographql/apollo-server/blob/6b9c2a0f1932e6d8fb94a8662cc1da24980aec6f/packages/apollo-server-core/src/requestPipeline.ts#L126