【问题标题】:JestJS: Async test isn't stoppedJestJS:异步测试没有停止
【发布时间】:2019-01-07 06:27:47
【问题描述】:

我在这个玩笑测试中遇到了两个问题:

  1. 是否可以只定义一次Content 集合,而不是在测试中执行此操作?
  2. 我确实收到了这个错误:

    Jest 在测试运行完成后一秒钟没有退出。 这通常意味着在您的测试中没有停止异步操作。考虑使用 --detectOpenHandles 运行 Jest 来解决此问题。

我不明白为什么我的异步代码没有停止...

import resolvers from 'resolvers/'
import Db from 'lib/db'
const db = new Db()

describe('Resolver', () => {
  let token

  beforeAll(async () => {
    await db.connect()
  })
  beforeEach(async () => {
    token = 'string'
    await db.dropDB()
  })
  afterAll(async () => {
    await db.connection.close()
  })

  describe('articleGetContent()', () => {
    test('should return dataset', async () => {
      // SETUP
      const Content = db.connection.collection('content')
      const docs = [{
        // some content...
      }]
      await Content.insertMany(docs)
      // EXECUTE
      const result = await resolvers.Query.articleGetContent({}, {
        id: '123,
        language: 'en'
      }, {
        token
      })
      // VERIFY
      expect.assertions(1)
      expect(result).toBeDefined()
    })
  })
})

解析器

import { articleGetContent } from '../models/article'

export default {
  Query: {
    articleGetContent: async (obj, { id }, { token }) => articleGetContent(id, token)
  }
}

这就是我的数据库类的样子

db.js

export default class Db {
  constructor (uri, callback) {
    const mongo = process.env.MONGO || 'mongodb://localhost:27017'
    this.mongodb = process.env.MONGO_DB || 'testing'
    this.gfs = null
    this.connection = MongoClient.connect(mongo, { useNewUrlParser: true })
    this.connected = false
    return this
  }

  async connect (msg) {
    if (!this.connected) {
      try {
        this.connection = await this.connection
        this.connection = this.connection.db(this.mongodb)
        this.gfs = new mongo.GridFSBucket(this.connection)
        this.connected = true
      } catch (err) {
        console.error('mongo connection error', err)
      }
    }
    return this
  }

  async disconnect () {
    if (this.connected) {
      try {
        this.connection = await this.connection.close()
        this.connected = false
      } catch (err) {
        console.error('mongo disconnection error', err)
      }
    }
  }

  async dropDB () {
    const Content = this.connection.collection('content')
    await Content.deleteMany({})
  }
}

【问题讨论】:

    标签: javascript mongodb testing jestjs


    【解决方案1】:

    second 问题有关,希望您在 github 上发现了一些关于它的问题。 通常,调试日志中描述了该问题。 Jest 使用 Promise,因此,您不应将任何异步操作留在任何状态,除非已解决。

    在您的情况下,您的数据库连接已打开,因此您需要为您的数据库类实现另一种方法disconnectthis link to docs 会帮助您,但我想您已经拥有它,因为它不是完整的 db.js文件(我看到了一些自定义方法dropDB。这里的主要想法是把它放在afterAll钩子中:

    afterAll(() => db.disconnect());

    page底部的好例子


    第一个问题呢,这真的取决于你在你的方法dropDB中做了什么。如果您正在运行 dropping collection 的方法,您可以将对该集合的引用存储在外部某处并使用它,因为它会自动创建新集合,但很高兴看到此方法。


    另外,您的异步测试以错误的方式创建,您可以在我的更新中阅读更多 here。你需要在测试开始时运行这个函数:expect.assertions(number)

    expect.assertions(number) 验证一定数量的断言 在测试期间被调用。这在测试时通常很有用 异步代码,以确保回调中的断言 实际上被调用了。

    【讨论】:

    • 不幸的是我的数据库类似乎是错误的。我更新了代码并尝试添加断开连接方法,但这目前失败了。我在测试中添加了afterAll(),但仍然得到同样糟糕的结果。
    • db.connection.close() 是什么意思?您已经在所有测试之前打开了与数据库的连接,您需要在所有测试之后关闭与数据库的连接
    • 我已在帖子中向您发送了一个链接:mongodb.github.io/node-mongodb-native/api-generated/…
    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 2018-06-29
    • 2022-11-11
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多