问题描述
自从弃用 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中找到调用结构。