【问题标题】:Get headers with executeOperation on Apollo Server (apollo-server) for integrations tests在 Apollo Server (apollo-server) 上使用 executeOperation 获取标头以进行集成测试
【发布时间】:2021-09-02 16:06:12
【问题描述】:

自从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 访问此标头有任何想法吗?

【问题讨论】:

    标签: graphql apollo apollo-server


    【解决方案1】:

    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

    【讨论】:

    【解决方案2】:

    我可以这样设置标题:

    const res = await apolloServer.executeOperation({ query: chicken, variables: { id: 1 } }, {req: {headers: 'Authorization sdf'}});
    

    【讨论】:

    • 你的意思是request? req 不是已知属性。
    • 嗯,也许req 来自不同的版本。确保你有和我一样的括号结构。
    猜你喜欢
    • 2022-08-10
    • 2020-08-19
    • 2020-09-13
    • 2020-12-22
    • 2022-07-10
    • 2018-10-18
    • 2021-01-18
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多