HTTP-тестирование узла Mocha - зависание сокета - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь научиться тестировать с помощью узла, для этого я использую фреймворк Mocha.

Я пытаюсь отправить запрос на экспресс-сервер, выполняя вычисление двух чисел и возвращая его как структурированный объект {result: sum}.

Тем не менее, я получаю предупреждение UnhandledPromiseRejection по причине: сокет зависает. Я провел некоторые исследования, и на данный момент я пришел к выводу, что ошибка возникает на сервере, когда клиент перестает прослушивать ответ на запрос отправки, прежде чем сервер отправит свой ответ. (если я ошибаюсь, я не возражаю против некоторых разъяснений).

Это мой тест Мокко:

const expect = require("chai").expect
const PORT = require("../server").PORT
const app = require("../server").app
const fetch = require("node-fetch")

const BASE_URL = `https://localhost:${PORT}/api/calc/`
let httpServer;
describe("testing endpoints for calculator Rest API", function () {

    before("starting the server..", function(done) {
        httpServer = app.listen(PORT)
        console.log("server is started")
        done()
    })

     describe("testing the add endpoint", function(){
         console.log("testing the API now!")
         it("add endpoints result should evaluate to 10", function(){
            fetch(`${BASE_URL}add/5/5`)
            .then(response => expect(response.result).to.be(10))
         })
     })
     after("shutting down the server..", function(){
        httpServer.close()  
     })

})

и это моя трассировка стека:

jonas@jonas:~/Desktop/testdemo1$ mocha
testing the API now!


  testing endpoints for calculator Rest API
starting server..
server started
    testing the add endpoint
      ✓ add endpoints result should evaluate to 10
(node:1949) UnhandledPromiseRejectionWarning: FetchError: request to https://localhost:1234/api/calc/add/5/5 failed, reason: socket hang up
    at ClientRequest.<anonymous> (/home/jonas/Desktop/testdemo1/node_modules/node-fetch/lib/index.js:1444:11)
    at emitOne (events.js:116:13)
    at ClientRequest.emit (events.js:211:7)
    at TLSSocket.socketErrorListener (_http_client.js:387:9)
    at emitOne (events.js:116:13)
    at TLSSocket.emit (events.js:211:7)
    at emitErrorNT (internal/streams/destroy.js:64:8)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
(node:1949) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:1949) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.


  1 passing (55ms)

Тест пройден, однако я получаю это длинное неприятное предупреждение, что это значит и как мне от него избавиться?


EDIT

describe("testing endpoints for calculator Rest API", function () {

    before("starting the server..", function(done) {
        httpServer = app.listen(PORT, done)
        console.log(`server listening on port:${PORT}...`)
    })

     describe("testing the add endpoint", function(done){
         it("add endpoints result should evaluate to 10", function(){
            fetch(`${BASE_URL}add/5/5`).then(response => expect(response.result).to.be(10)).then(done).catch(done)
         })
     })

дает трассировку стека:

  ✓ add endpoints result should evaluate to 10
(node:27175) UnhandledPromiseRejectionWarning: FetchError: request to https://localhost:1234/api/calc/add/5/5 failed, reason: socket hang up
    at ClientRequest.<anonymous> (/home/jonas/Desktop/testdemo1/node_modules/node-fetch/lib/index.js:1444:11)
    at emitOne (events.js:116:13)
    at ClientRequest.emit (events.js:211:7)
    at TLSSocket.socketErrorListener (_http_client.js:387:9)
    at emitOne (events.js:116:13)
    at TLSSocket.emit (events.js:211:7)
    at emitErrorNT (internal/streams/destroy.js:64:8)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
(node:27175) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:27175) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

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

before("starting the server..", function (done) {
    httpServer = app.listen(PORT, done) // <- here
})

describe("testing the add endpoint", function () {
    console.log("testing the API now!")
    it("add endpoints result should evaluate to 10", function (done) {
        fetch(`${BASE_URL}add/5/5`)
            .then(response => {
                expect(response.result).to.be(10)
            })
            .then(done) // <- here
            .catch(done) // <- here
    })
})
after("shutting down the server..", function (done) {
    httpServer.close(done) // <- here
})

Как вы можете видеть здесь, я НЕ прикрепил оператор then к функции it.

fetch(`${BASE_URL}add/5/5`).then(response => expect(response.result).to.be(10)).then(done).catch(done)

Если это не решит вашу проблему, вероятно, существует проблема с маршрутом для /add/5/5.

0 голосов
/ 06 марта 2019

Вы должны позвонить done() в ваших тестах, в обратном вызове, когда тест закончен.Функция done передается обратному вызову, который вы используете в блоке it.Кроме того, вы должны всегда следить за своими ошибками https://mochajs.org/#asynchronous-code

const expect = require("chai").expect
const PORT = require("../server").PORT
const app = require("../server").app
const fetch = require("node-fetch")

const BASE_URL = `https://localhost:${PORT}/api/calc/`
let httpServer;
describe("testing endpoints for calculator Rest API", function () {

    before("starting the server..", function(done) {
        httpServer = app.listen(PORT)
        console.log("server is started")
        done()
    })

     describe("testing the add endpoint", function(){
         console.log("testing the API now!")
         it("add endpoints result should evaluate to 10", function(done){
            fetch(`${BASE_URL}add/5/5`)
            .then(response => {
              expect(response.result).to.be(10)
              done();
            }).catch(e => done(e)) // or just .catch(done)
         })
     })
     after("shutting down the server..", function(){
        httpServer.close()  
     })

})
...