Узел / Экспресс Необработанные обещания отклоняются - PullRequest
0 голосов
/ 27 мая 2019

Я пытался разрешить эти необработанные отклонения Обещания, которые я продолжаю получать в своем коде.

Текущий, который я получаю, выглядит следующим образом:

[nodemon] начиная с mocha --recursive -R min (узел: 35286) UnhandledPromiseRejectionWarning: AssertionError [ERR_ASSERTION]: выражение оценивается как ложное значение:

подтвердить (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 или отклоняя обещание, которое было не обрабатывается с помощью .catch (). (идентификатор отклонения: 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();
          });
        });
    });
  });
});

Чтобы справиться с отклонениями Обещания, которые я получил ранее, я сделал это:

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);
};

Ответы [ 3 ]

0 голосов
/ 27 мая 2019

Если вы правильно связываете свои обещания, вы сможете уловить ошибку:

describe("Drivers controller", () => {
    it("Post to /api/drivers create a new driver", () => {
        let oldCount;
        return Driver.count()
            .then(count => {
                oldCount = count;
                return new Promise((resolve, reject) => {
                    request(app)
                        .post("api/drivers")
                        .send({ email: "test@test.com" })
                        .end((err, res) => {
                            if (err) {
                                reject(err);
                            } else {
                                resolve(res);
                            }
                        });
                });
            }).then(() => {
                return Driver.count();
            }).then(newCount => {
                assert(oldCount + 1 === newCount);
            });
    });
});

В вашем примере у вас были обещания внутри обещаний, но вы не возвращали / не ожидали их. Если оператор assert выдает ошибку, ошибка не будет перенаправлена ​​на внешнее обещание.

0 голосов
/ 27 мая 2019

Чтобы прояснить будущим читателям, которые могут столкнуться с этой проблемой, при наличии ошибки / неверного утверждения в тесте Мокка в обещании возникает ошибка: Для асинхронных тестов и хуков убедитесь, что «выполнено»()" называется;если вы возвращаете обещание, убедитесь, что оно разрешено

После рефакторинга в соответствии с Corschdi я добавил решение в ссылке, это обходит ошибку об обратном вызове done() и позволяет сразу понять суть проблемы.это то, что асинхронный тест действительно терпит неудачу.

0 голосов
/ 27 мая 2019

Я могу ошибаться, но вы делаете сравнение и вычисление, не посчитав +1 сначала.Что может это исправить:

assert((count + 1) === newCount)

Таким образом, в приведенном выше примере вы отделили расчет от сравнения значений.

См. Комментарий к этому ниже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...