测试graphql解析器时如何制作虚拟上下文?

Posted

技术标签:

【中文标题】测试graphql解析器时如何制作虚拟上下文?【英文标题】:How to make dummy context when testing graphql resolvers? 【发布时间】:2020-09-25 09:31:55 【问题描述】:

我想测试一些 graphql 突变。但我不确定在编写测试时要给出什么作为上下文。例如,我想调用 createPost 突变:

it('admin should create a post', async () => 
    await createPost(
      null,
      
        title: 'How to write a blog post',
        body: 'lorem ipsum dollar emmet',
        published: true,
      ,
      dummyContext
    ).should.be.fulfilled;
  );

这里作为一个 dummyContext 我使用这个:

  const dummyContext = 
    request:  get: () => token ,
  ;

但是,它不起作用。里面createPost突变logincheker方法被调用:

export async function loginChecker( request ) 
  const Authorization = request.get('Authorization');
  if (Authorization) 
    const token = Authorization.replace('Bearer ', '');
    const userInJwt = jwtValidator(token);
    const user = await prisma.user.findOne( where:  id: userInJwt.id  );
    if (!user) 
      throw new Error('Not Authorized');
    
    return user;
  

我在运行测试用例时遇到了这个错误

AssertionError: expected promise to be fulfilled but it was rejected with 'TypeError: Authorization.replace is not a function

【问题讨论】:

【参考方案1】:

如果您正在寻找集成测试,则无需模拟上下文。正如我创建的here 一样,您可以直接针对实际数据库运行服务器。在__tests__ 文件夹中,我已经针对实际服务器运行了它,因此您无需模拟上下文,可以直接针对数据库调用 API。

【讨论】:

以上是关于测试graphql解析器时如何制作虚拟上下文?的主要内容,如果未能解决你的问题,请参考以下文章

如何模拟 mongodb 以进行单元测试 graphql 解析器

Graphql没有为接口/联合定义解析器 - java

用于可迭代对象的 Java GraphQL 解析器:休眠异常

在客户端解析器中导入类型时,如何避免使用 Apollo 客户端和“graphql-codegen”的角度项目中的循环依赖?

GraphQL 解析器参数(根、参数、上下文)的错误顺序

GraphQL 订阅字段无法访问解析器的上下文