我们如何在测试中将头传递给阿波罗服务器executeOperation?
这里提到的是传递headers对象这里
我试图通过带有或不带JWT令牌的auth头来测试访问控制。
const result = await server.executeOperation({ query: query, http: { headers: { authorization: "" } } })
// Type '{ authorization: string; }' is not assignable to type 'Headers'.
// Object literal may only specify known properties, and 'authorization' does not exist in type 'Headers'.ts(2322)这将导致类型错误。在fetch.d.ts中的阿波罗服务器类型中定义了一个Header类,但是我无法导入来实例化它。
使用"apollo-server": "^2.25.2"。有什么提示或链接可以让这一切顺利进行吗?
更新:作为一项工作,我在服务器上下文中解密和解码JWT,并在其中传递一个经过身份验证的用户。然后,我可以模拟整个上下文,并使用模拟的上下文创建一个新的测试服务器。很高兴能够使用标题来获得更多的产品(比如体验),但这对目前来说是可行的。
import { mockDeep, mockReset } from 'jest-mock-extended'
interface Context {
prisma: PrismaClient
user: () => User|null
}
export const context = mockDeep<Context>()
export const testServer = new ApolloServer({
typeDefs,
resolvers,
context
});
// ...
context.user.mockReturnValue({
id: 1,
name: "Foo",
slug: "foo",
})
const res = await testServer.executeOperation({ query: query })发布于 2022-08-10 01:09:13
阿波罗服务器现在支持executeOperation的第二个参数。可以提供上下文函数中使用的参数。
const result = await server.executeOperation(
{ query: query },
{ req: { headers: { authorization: '...' } } }
);注意:使用类型记录,它会抱怨,但您可以将其转换为任意类型,并避免构建整个express.Request类型。
用阿波罗-服务器-core@3.5.0测试
另一种解决方案有效,但我发现这一种方法很方便。如果您模拟令牌解析,您可以很容易地模拟来自不同用户的调用。
发布于 2022-05-15 05:21:15
为了解决这个问题,我使用已经解密的JWT令牌创建了一个“假”请求对象,用于初始化第三方auth对象(keycloak)并传递给阿波罗上下文。我需要初始化keycloak对象,因为我有身份验证模式指令,需要初始化keycloak对象。
const req = {
kauth: {
grant: {
access_token: {
isExpired: () => {
return false;
},
token: "abc",
content: {
email: "me@me.com",
resource_access: {
"my-api": {
roles: ["admin"],
},
},
},
},
},
},
};
server = new ApolloServer({
schema,
resolvers,
dataSources: () => ({
users,
}),
context: () => {
return { kauth: new KeycloakContext({ req }) };
},
});
});不过,我还是想要一种更适合阿波罗的解决方案,而不是一项工作。
https://stackoverflow.com/questions/68795743
复制相似问题