我一直在尝试解决我在代码中继续遇到的这些未处理的Promise拒绝。
我得到的当前信息如下:
[nodemon]从
mocha --recursive -R min
开始(节点:35286) UnhandledPromiseRejectionWarning:AssertionError [ERR_ASSERTION]: 表达式计算为假值:assert(count + 1 === newCount)
at Driver.count.then.newCount (/Users/danale/Projects/muber/test/controllers/drivers_controller.test.js:16:13) at processTicksAndRejections (internal/process/next_tick.js:81:5) (node:35286) UnhandledPromiseRejectionWarning: Unhandled promise
拒绝。该错误是由抛出异步内部引起的 没有捕获块或拒绝承诺 未使用.catch()处理。 (拒绝ID:1)(节点:35286)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。在 未来,未处理的承诺拒绝将终止 具有非零退出代码的Node.js进程。
应该通过的测试是这个:
const assert = require("assert");
const request = require("supertest");
const mongoose = require("mongoose");
const app = require("../../app");
const Driver = mongoose.model("driver");
describe("Drivers controller", () => {
it("Post to /api/drivers create a new driver", done => {
Driver.count().then(count => {
request(app)
.post("api/drivers")
.send({ email: "test@test.com" })
.end(() => {
Driver.count().then(newCount => {
assert(count + 1 === newCount);
done();
});
});
});
});
});
为了处理我早些时候遇到的Promise拒绝,我这样做了:
const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const routes = require("./routes/routes");
const app = express();
mongoose.Promise = global.Promise;
mongoose.connect("mongodb://localhost/muber", { useMongoClient: true });
app.use(bodyParser.json());
routes(app);
module.exports = app;
我要测试的控制器是:
const Driver = require("../models/driver");
module.exports = {
greeting(req, res) {
res.send({ hi: "there" });
},
create(req, res) {
console.log(req.body);
const driverProps = req.body;
Driver.create(driverProps).then(driver => res.send(driver));
}
};
我确实尝试将catch()
添加到测试中,如下所示:
describe("Drivers controller", () => {
it("Post to /api/drivers create a new driver", done => {
Driver.count()
.then(count => {
request(app)
.post("api/drivers")
.send({ email: "test@test.com" })
.end((err, res) => {
Driver.count().then(newCount => {
assert(count + 1 === newCount);
done();
});
});
})
.catch(error => console.log(error));
});
});
但是它不能解决错误。
这是我的路线处理程序:
const DriversController = require("../controllers/drivers_controller");
module.exports = app => {
// Watch for incoming requests of method GET to the route http://localhost:3050/api
app.get("/api", DriversController.greeting);
app.post("/api/drivers", DriversController.create);
};
答案 0 :(得分:0)
我可能是错的,但是您在进行比较和计算时没有先进行count + 1运算。可能会解决的问题:
assert((count + 1) === newCount)
因此,在上面的示例中,您将计算与比较值分开。
在下面查看对此的评论
答案 1 :(得分:0)
如果您正确地兑现了诺言,您将能够发现错误:
libbarex
在您的示例中,您在承诺内有承诺,但没有返回/等待这些承诺。如果assert语句引发错误,该错误将不会转发给外部诺言。
答案 2 :(得分:0)
为了使以后可能遇到此问题的读者更清楚,当Mocha测试中存在错误/不正确的断言时,在Promise中会引发错误: For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves
根据corschdi进行重构之后,我在链接中添加了解决方案,这绕过了关于done()
回调的错误,使您直接了解了异步测试确实失败的问题的核心。