【发布时间】:2019-03-21 07:21:00
【问题描述】:
因此,我过去从未在我的所有项目中真正实施过任何测试,并决定开始在我正在从事的新项目中实施它。作为一个初学者,我对我得到的输出有点困惑。
当我使用 Postman 时。它不会返回 500 错误,而是将信息保存到后端。我在运行测试时遇到的错误是
1) POST /users
Creates a new user:
Error: expected 200 "OK", got 500 "Internal Server Error"
我还将展示我的代码的外观,以便找出我哪里出错了。
// 测试
var express = require("express");
var request = require("supertest");
var app = express();
let router = require("../../server/routes/api/users");
app.use(router);
describe("GET /test", function() {
it("Returns a json for testing", function(done) {
request(app)
.get("/test")
.set("Accept", "application/json")
.expect("Content-Type", /json/)
.expect(200, done);
});
});
describe("POST /users", () => {
let data = {
name: "dummy",
email: "dummy@dummy.com",
password: 123456
};
it("Creates a new user", done => {
request(app)
.post("/register")
.send(data)
.set("Accept", "application/json")
.expect("Content-Type", "text/html; charset=utf-8")
.expect(200)
.end(err => {
if (err) return done(err);
done();
});
});
});
// 用户路由文件
router.post("/register", (req, res) => {
User.findOne({ email: req.body.email }).then(user => {
if (user) {
res.json({ msg: "User exist" });
} else {
const newUser = new User({
name: req.body.name,
email: req.body.email,
password: req.body.password
});
newUser
.save()
.then(user => console.log(user))
.catch(err => console.log(err));
}
});
});
// 用户猫鼬模型文件
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
// Create Schema
const UserSchema = new Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
date: {
type: Date,
default: Date.now
}
});
module.exports = User = mongoose.model("users", UserSchema);
如果您还想看到我遗漏的其他内容,请随时提出并期待更好地了解测试。
【问题讨论】:
-
通常一个 500 来自 express 的错误,您自己没有进行显式错误处理,来自 express 的内部错误处理,当它遇到未捕获的代码错误时。调试这些错误的一个好方法是将
try...catch块放置在您认为应该工作的代码段周围。例如,将User.findOne调用包装在 try...catch 中,然后将console.log(err)包装在 catch 块中。这可能不是问题的根源,但它可以帮助您追踪问题或从潜在来源列表中消除它。 -
@JayReardon 感谢您的回复。我会更新我的代码,但这是奇怪的部分。使用 Postman 并看到数据发送到 MongoDB Atlas 时,我没有遇到 500 内部错误。但是当我运行我的测试时,它说它返回 500 而不是 200。
-
我同意这很奇怪;但是,当您尝试使用
supertest进行单元测试时,正常的服务器运行(当您使用 Postman 连接到它时)可能会有所不同,try...catch块的目的是帮助确定这些可能是什么.我们在 ExpressJS 项目中使用supertest的方式与您使用的方式非常相似,并且我描述的策略帮助我们确定了单元测试的设置问题。
标签: node.js testing mocha.js chai supertest