jest mockgoose - шутка не вышла через секунду после завершения пробного запуска - PullRequest
0 голосов
/ 29 июня 2018

У меня есть модель мангуста:

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) UnhandledPromiseRejectionWarning: необработанное обещание отклонение (идентификатор отклонения: 1): ReferenceError: done не определено (узел: 2199) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания устарели. В будущем обещают отклонения, которые не обрабатываются завершит процесс Node.js с ненулевым кодом выхода.

Затем модульный тест проходит, и тогда я получаю это сообщение об ошибке:

Jest не вышел из системы через секунду после завершения пробного запуска.

Обычно это означает, что существуют асинхронные операции, которые не были остановился на ваших тестах. Рассмотрите возможность запуска Jest с --detectOpenHandles для устранения этой проблемы.

Как мне завершить тест, как только я получу правильный результат?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

В начальном тесте было несколько ошибок.

На первое было указано @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."
          );
        });
      });
    });
  });
});
0 голосов
/ 29 июня 2018

Ошибка означает именно то, что написано, done не было определено, но используется. И это не нужно в случае использования обещаний. Jest поддерживает обещания, обещание должно быть возвращено из блока для правильной обработки:

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

Если есть проблема с открытыми дескрипторами, как в , этот вопрос , Mongoose можно явно отключить с помощью:

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