私はマングースモデルを持っています:
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);
});
});
});
});
});
テストを実行すると、次の2つの警告が表示されます。
(ノード:2199)UnhandledPromiseRejectionWarning:未処理のプロミス拒否(拒否ID:1):ReferenceError:doneは定義されていません(ノード:2199)[DEP0018] DeprecationWarning:未処理のプロミス拒否は非推奨です。将来、処理されないプロミスの拒否により、ゼロ以外の終了コードでNode.jsプロセスが終了します。
その後、単体テストに合格すると、次のエラーメッセージが表示されます。
Jestは、テストの実行が完了してから1秒後に終了しませんでした。
これは通常、テストで停止されなかった非同期操作があることを意味します。この問題のトラブルシューティングを行うには、
--detectOpenHandles
でJestを実行することを検討してください。
正しい結果が得られたら、どのようにテストを終了しますか?
このエラーは、done
が定義されていなかったが使用されているという意味です。また、Promiseが使用される場合には必要ありません。 Jestはプロミスをサポートしています。プロミスは適切に処理するためにブロックから返される必要があります。
afterEach(() => mockgoose.helper.reset());
この質問 のようにオープンハンドルに問題がある場合、Mongooseは次のように明示的に切断できます。
afterAll(() => mongoose.disconnect());
最初のテストにはいくつか問題がありました。
1つ目は@estusによって指摘されたもので、jest
でテストするときにプロミスを返す必要があります。質問のタイトルでエラーを引き起こした2番目の問題は、テスト後にdb接続を適切に閉じなかったことが原因でした。
これは、すべてが期待どおりに実行される最終コードです。
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."
);
});
});
});
});
});