【问题标题】:Getting 500 "Internal Server Error" while using Supertest使用 Supertest 时出现 500“内部服务器错误”
【发布时间】: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


【解决方案1】:

POST 测试预期的响应与服务器发送的响应不匹配。 在 POST 测试中将 200 更改为 500 并显示响应,然后您将看到预期的响应和服务器发送的响应,因此可以比较两者并进行更改。 有点像这样---

 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(response => {console.log(response)})
      .expect(500, done);
  });
});

现在比较预期的内容和服务器发送的内容。 并更改您的代码(在测试收到的响应中,因为大多数情况下它是响应附带的数据库集合中的对象/文档 ID),

不要忘记将 500 改回 200 并继续更改。

【讨论】:

    最近更新 更多