代码之家  ›  专栏  ›  技术社区  ›  Miha Å uÅ¡terÅ¡ič

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

  •  5
  • Miha Å uÅ¡terÅ¡ič  · 技术社区  · 7 年前

    我有一个猫鼬模型:

    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;
    

    一个简单的单元测试 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);
            });
          });
        });
      });
    });
    

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

    (节点:2199)未处理的PromiseRejectionWarning:未处理的Promise 拒绝(拒绝ID:1):引用错误:未定义完成 (节点:2199)[dep0018]否决警告:未处理的承诺拒绝 已弃用。在未来,承诺拒绝不被处理 将使用非零退出代码终止node.js进程。

    然后单元测试通过,然后我得到以下错误消息:

    测试运行完成后,jest未在一秒钟内退出。

    这通常意味着有些异步操作 在你的测试中停止。考虑开玩笑 --detectOpenHandles 以解决此问题。

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

    2 回复  |  直到 6 年前
        1
  •  4
  •   Estus Flask    7 年前

    这个错误的意思正是它所说的, done 没有定义,但使用了它。也不需要它以防承诺被利用。jest支持promises,为了得到正确的处理,promise应该从块中返回:

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

    如果打开手柄有问题 this question ,Mongoose可以显式断开连接:

    afterAll(() => mongoose.disconnect());
    
        2
  •  2
  •   Miha Å uÅ¡terÅ¡ič    7 年前

    最初的测试有一些问题。

    第一个是由@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."
              );
            });
          });
        });
      });
    });