用 Jest 测试 GraphQL 解析器

Posted

技术标签:

【中文标题】用 Jest 测试 GraphQL 解析器【英文标题】:Testing GraphQL resolvers with Jest 【发布时间】:2018-11-03 04:59:20 【问题描述】:

我正在寻找使用 Jest 为 GraphQL 解析器编写测试,但我真的不知道从哪里开始。解析器是简单的 CRUD 函数,用于在 NodeJS 上使用 mongoose 写入 MongoDB 数据库。

类型:

type Article 
  _id: ID!
  title: String
  authors: [User]

查询

extend type Query 
  articles: [Article]
  article(_id: ID!): Article

解析器(只读)

Query: 
  articles: () => new Promise((resolve, reject) => 
    Article.find(, (err, articles) => 
      if (err) reject(err);
      else resolve(articles);
    );
  ),
  article: (root, 
    _id,
  ) => new Promise((resolve, reject) => 
    Article.findById(_id, (err, article) => 
      if (err) reject(err);
      else resolve(article);
    );
  ),
,

如何在不与数据库交互的情况下进行测试?

【问题讨论】:

尤其是 MongoDB,那里有很多资源。 medium.com/entria/…npmjs.com/package/mongo-mockfacebook.github.io/jest/docs/en/mongodb.html 据我所知,这将创建一个模拟服务器,我可以在其中测试 mongodb 命令,但不能测试 graphQL 解析器。如果我将解析器文件导入到测试中,它将连接到“真实”数据库。看来我需要拦截该连接并用模拟数据库替换 【参考方案1】:

按照这些步骤进行

使用环境变量根据模式(生产、测试​​、开发)更改数据库 导入架构

像这样编写测试并使用 graphql

const query=`mutation name($id:String!)  //dummy example query
   
        user(id:$id)
        
         //fields goes here
          
   ` 
const result = await graphql(schema, query, , , data);
if (result.data) 
    return result.data.addEventTag
 else 
    throw new Error(...result.errors.map(err => ` \n$err.message`));
  

所以不需要直接导入resolver,graphQl会用到,一定要按照模式连接数据库。

【讨论】:

以上是关于用 Jest 测试 GraphQL 解析器的主要内容,如果未能解决你的问题,请参考以下文章

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

GraphQL 字段的解析器没有被调用

Nestjs中多个graphql解析器实现的问题

MongoDB Stitch GraphQL 自定义突变解析器返回 null

GraphQL:从兄弟解析器访问另一个解析器/字段输出

graphql-yoga - GraphQL 解析器参数在哪里定义和记录?