【问题标题】:jest mockgoose - jest did not exit one second after the test run has completedjest mockgoose - jest 在测试运行完成后一秒钟没有退出
【发布时间】:2018-12-08 18:59:58
【问题描述】:

我有一个猫鼬模型:

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;

还有一个使用mockgoosejest 的简单单元测试:

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);
        });
      });
    });
  });
});

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

(node:2199) UnhandledPromiseRejectionWarning: 未处理的承诺 拒绝(拒绝 id:1):ReferenceError:未定义完成 (节点:2199)[DEP0018] DeprecationWarning:未处理的承诺拒绝 已弃用。将来,未处理的承诺拒绝 将使用非零退出代码终止 Node.js 进程。

然后单元测试通过,然后我得到这个错误信息:

Jest 在测试运行完成后一秒没有退出。

这通常意味着存在未执行的异步操作 在您的测试中停止。考虑运行 Jest --detectOpenHandles 解决此问题。

当我得到正确的结果后如何终止测试?

【问题讨论】:

    标签: javascript node.js mongoose jestjs mockgoose


    【解决方案1】:

    最初的测试有一些问题。

    @estus 指出了第一个,使用jest 进行测试时需要返回承诺。 导致题主错误的第二个问题是由于测试后没有正确关闭数据库连接造成的。

    这是一切按预期运行的最终代码:

    var { Mockgoose } = require("mockgoose");
    var mongoose = require("mongoose");
    var Transaction = require("./transaction");
    
    var mockgoose = new Mockgoose(mongoose);
    
    describe("transaction", function() {
      afterEach(function() {
        return mockgoose.helper.reset();
      });
    
      afterAll(function() {
        const { connections } = mongoose;
        const { childProcess } = mockgoose.mongodHelper.mongoBin;
        // kill mongod
        childProcess.kill();
        // close all connections
        for (const con of connections) {
          return con.close();
        }
        return mongoose.disconnect();
      });
    
      it("category is required", function() {
        expect.assertions(1);
        return mockgoose.prepareStorage().then(function() {
          mongoose.connect("mongodb://foobar/baz");
          return mongoose.connection.on("connected", function() {
            var mockTransaction = new Transaction({
              amount: 25,
              comment: "Gas money, Petrol.",
              tags: ["Gas", "Car", "Transport"],
              currency: "EUR"
            });
            return mockTransaction.save(function(err, savedTransaction) {
              console.log(err.errors.category.properties.message);
              expect(err.errors.category.properties.message).toBe(
                "Category is required."
              );
            });
          });
        });
      });
    });
    

    【讨论】:

    • 太棒了。这帮助我解决了我遇到的问题
    • 这解决了我两天来一直在努力解决的问题,谢谢!
    【解决方案2】:

    错误的意思正是它所说的,done 未定义但已被使用。如果使用了 Promise,则不需要它。 Jest 支持 Promise,应从块中返回 Promise 以便正确处理:

    afterEach(() => mockgoose.helper.reset());
    

    如果在this question 中打开句柄出现问题,Mongoose 可以通过以下方式显式断开连接:

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

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 2023-03-13
      • 1970-01-01
      • 2021-03-28
      • 2019-06-15
      • 2019-09-16
      • 2019-05-24
      • 2020-08-26
      • 2021-01-13
      相关资源
      最近更新 更多