Получение 500 Internal Server Error при использовании Supertest

Итак, в прошлом я никогда не проводил тестирование во всех своих проектах и ​​решил начать его реализацию в новом проекте, над которым работаю. Как новичок, я немного запутался с выводом, который я получаю.

Когда я использую 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: "[email protected]",
    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);

Если есть что-то еще, что я упускаю, что вы хотели бы увидеть, пожалуйста, не стесняйтесь спрашивать и с нетерпением жду лучшего понимания тестирования.


person Yama    schedule 16.10.2018    source источник
comment
Обычно ошибка 500 от экспресса, когда вы не выполняете явную обработку ошибок самостоятельно, возникает из-за внутренней обработки ошибок экспресса, когда она обнаруживает ошибку в коде, который не перехвачен. Хороший способ отладки этих ошибок — разместить блоки try...catch вокруг участков кода, которые, по вашему мнению, должны работать. Например, оборачивая вызов User.findOne в блок try...catch, а затем console.log(err) в блок catch. Это может не быть источником проблемы, но может помочь вам отследить проблему или исключить ее из списка потенциальных источников.   -  person JayReardon    schedule 16.10.2018
comment
@JayReardon Спасибо за ответ. Я обновлю свой код, но это странная часть. Я не сталкиваюсь с внутренней ошибкой 500 при использовании Postman и вижу, что данные отправляются в MongoDB Atlas. Но когда я запускаю свой тест, он говорит, что возвращает 500 вместо 200.   -  person Yama    schedule 16.10.2018
comment
Я согласен, что это странно; однако могут быть обстоятельства для нормального запуска сервера (когда вы подключаетесь к нему с помощью Postman), которые отличаются, когда вы пытаетесь выполнить модульный тест с supertest, и цель блоков try...catch состоит в том, чтобы помочь определить, что это может быть. Мы используем supertest почти так же, как и вы, в наших проектах ExpressJS, и стратегия, которую я описал, помогла нам выявить проблемы с настройкой в ​​нашем модульном тестировании.   -  person JayReardon    schedule 16.10.2018


Ответы (1)


Ответ, ожидаемый тестом POST, не соответствует ответу, отправленному сервером. В тесте POST измените 200 на 500 и отобразите ответ, затем вы увидите ожидаемый ответ и ответ, отправленный сервером, и, следовательно, сможете сравнить их и внести изменения. Как-то так ---

 describe("POST /users", () => {
  let data = {
    name: "dummy",
    email: "[email protected]",
    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,end);
  });
});

теперь сравните ожидаемое и отправленное сервером. И внесите изменения в свой код (в ответе, полученном тестом, так как большую часть времени это идентификатор объекта/документа в коллекции базы данных, поскольку он приходит с ответом),

Не забудьте поменять 500 обратно на 200 и продолжить изменения.

person neelesh bisht    schedule 10.07.2019