jest mockgoose - 在测试运行完成后,jest没有退出一秒钟

Mih*_*šič 5 javascript mongoose node.js jestjs mockgoose

我有一个猫鼬模型:

var mongoose = require("mongoose");

var transactionSchema = mongoose.Schema({
  category: { type: String, required: [true, "Category is required."] },
  amount: Number,
  comment: String,
  tags: Array,
  currency: String
});

var Transaction = mongoose.model("Transaction", transactionSchema);

module.exports = Transaction;
Run Code Online (Sandbox Code Playgroud)

并使用mockgoose和进行简单的单元测试jest:

var { Mockgoose } = require("mockgoose");
var mongoose = require("mongoose");
var Transaction = require("./transaction");

var mockgoose = new Mockgoose(mongoose);

describe("transaction", function() {
  afterEach(function() {
    mockgoose.helper.reset().then(() => {
      done();
    });
  });

  it("category is required", function() {
    mockgoose.prepareStorage().then(() => {
      mongoose.connect("mongodb://foobar/baz");
      mongoose.connection.on("connected", () => {
        var mockTransaction = new Transaction({
          category: "Transportation",
          amount: 25,
          comment: "Gas money, Petrol.",
          tags: ["Gas", "Car", "Transport"],
          currency: "EUR"
        });
        mockTransaction.save(function(err, savedTransaction) {
          if (err) return console.error(err);
          expect(savedTransaction).toEqual(mockTransaction);
        });
      });
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

现在,当我运行测试时,我收到了以下两个警告:

(node:2199)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):ReferenceError:未定义done(节点:2199)[DEP0018]弃用警告:不推荐使用未处理的承诺拒绝.将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程.

然后单元测试通过,然后我收到此错误消息:

测试运行完成后,Jest没有退出一秒钟.

这通常意味着您的测试中没有停止异步操作.考虑运行Jest --detectOpenHandles来解决此问题.

一旦得到正确的结果,我该如何终止测试?

Est*_*ask 5

该错误表示的是确切的内容,done尚未定义但已被使用。如果使用了诺言,则不需要它。Jest支持promise,应从块中返回promise,以便对其进行正确处理:

afterEach(() => mockgoose.helper.reset());
Run Code Online (Sandbox Code Playgroud)

如果在此问题中打开句柄存在问题,可以使用以下方法显式断开Mongoose的连接:

afterAll(() => mongoose.disconnect());
Run Code Online (Sandbox Code Playgroud)