我有只猫鼬模型:
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:未处理的承诺拒绝(拒绝id: 1):ReferenceError: done未定义(节点:2199) DEP0018 DeprecationWarning:未处理的承诺拒绝被取消。在未来,承诺不处理的拒绝将使用非零退出代码终止Node.js进程。
然后单元测试通过,然后我得到以下错误消息:
在测试运行完成后,Jest没有退出一秒钟。 这通常意味着在测试中没有停止异步操作。考虑使用
--detectOpenHandles运行Jest来解决此问题。
一旦得到正确的结果,如何终止测试?
发布于 2018-06-29 14:55:39
这个错误的意思正是它所说的,done没有被定义,但是它被使用了。当承诺被使用时,它是不需要的。开玩笑支持承诺,承诺应该从块中返回,这样才能正确地处理:
afterEach(() => mockgoose.helper.reset());如果打开句柄(如在this question中)出现问题,则可以显式地断开与以下命令的连接:
afterAll(() => mongoose.disconnect());发布于 2018-06-29 15:02:59
最初的测试有一些问题。
第一个是@estus指出的,在用jest进行测试时需要返回承诺。导致问题标题错误的第二个问题是测试后未正确关闭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."
);
});
});
});
});
});https://stackoverflow.com/questions/51104155
复制相似问题