(已解决)如何在 jest 中进行测试,以在 Node-postgres 中的错误处理中间件中传递 JavaScript 中的 PostgreSQL 数据库(未定义)?

问题描述 投票:0回答:1

我刚刚开始在 Jest 中进行一些基本的错误处理测试。我有与鸟类相关的数据库,我想让我的测试文件中的下面的测试通过。

//app.test.js

const request = require("supertest")
const db = require("../db/index.js")
const {wing_shapeData,birdsOrdersData,birdsFamiliesData,birdsData,birdwatchersData,rookeryTourData,watcherTourData} = require("../db/data/test-data/index.js")
const seed = require("../db/seed.js")
const app = require("../app.js")

beforeEach(() =>seed({wing_shapeData,birdsOrdersData,birdsFamiliesData,birdsData,birdwatchersData,rookeryTourData,watcherTourData}))

afterAll(() =>db.end())


describe("Endpoint(path) is not recognized and cannot be found for rookery",()=>{

    it("Should return status code 404 when passed bad path",()=>{
        return request(app).get('/api/fjrofjiro303gjvn200').expect(404).then(({ body }) => {
            expect(body.msg).toBe('HTTP 404 error: path cannot be found');
          });
    })
})

当我在终端中执行 npm test app.test.js 时,出现此错误

__tests__/app.test.js
  Endpoint(path) is not recognized and cannot be found for rookery
    ✕ Should return status code 404 when passed bad path (96 ms)

  ● Endpoint(path) is not recognized and cannot be found for rookery › Should return status code 404 when passed bad path

    expect(received).toBe(expected) // Object.is equality

    Expected: "HTTP 404 error: path cannot be found"
    Received: undefined

      14 |     it("Should return status code 404 when passed bad path",()=>{
      15 |         return request(app).get('/api/fjrofjiro303gjvn200').expect(404).then(({ body }) => {
    > 16 |             expect(body.message).toBe('HTTP 404 error: path cannot be found');
         |                                  ^
      17 |           });
      18 |     })
      19 | })

      at toBe (__tests__/app.test.js:16:34)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.337 s, estimated 1 s
Ran all test suites matching /app.test.js/i.

这是我的 app.js 文件的一部分

const express = require('express');
onst app = express();
app.use(express.json())

app.use((req, res, next) => {
    console.log('Request method: ', req.method);
    console.log('Request url: ', req.url);
    let currentdate = new Date(); 
    let datetime = `Date and time request method made(format:day/month/year|hours:minutes:seconds): ${currentdate.getDate()}/${(currentdate.getMonth()+1)}/${currentdate.getFullYear()}|${currentdate.getHours()}:${currentdate.getMinutes()}:${currentdate.getSeconds()}`
    console.log(datetime)
    next()
  });

  const errorLogger = (err,req,res,next) =>{
    console.log(`Error : ${err.message}`)
    next(err)
  }

  const handleNotFound = (req,res,next)=>{   
      res.status(404).send({message: 'HTTP 404 error: path cannot be found'})
    
    next()
    
  }
  const errorResponder = (err,req,res,next) =>{
      if(err.statusCode  && err.message){
      res.status(err.statusCode).send({message: err.message})
      }
      next(err)
  }
  
  const handleServerError = (err, req,res,next) => {
    res.status(500).send(err.message)
  }

  app.use(errorLogger)
  app.use(handleNotFound)
  app.use(errorResponder)
  app.use(handleServerError)


app.get('/api/birds',getAllBirds)

下面的控制器:调用模型并处理请求-响应周期

//birds.controller.js

exports.getAllBirds = (req,res,next) =>{
 const {order1} = req.query
 const {order2} = req.query
 const {sort_byfirst} = req.query
 const {sort_bysecond} = req.query
 const {diet} = req.query
 selectAllBirds(sort_byfirst,order1,diet,sort_bysecond,order2).then((birds)=> res.status(200).send({birds})).catch(next)
}

下面的模型:一旦数据库播种了数据,就访问数据库以检索相关数据


//birds.models.js
const db = require('../db/index.js')

exports.selectAllBirds = (sort_byfirst,order1,diet,sort_bysecond,order2) =>{


    const sortbyGreenList1 = ['length_cm','weight_g','wingspan_cm']
    const sortbyGreenList2 = ['common_name']

    const orderbyGreenList = ['ASC','DESC']
    let queryValues = [];
    let queryStr = `SELECT bird_id,common_name,species_name,wing_colour,diet,can_Fly
    ,length_cm,weight_g,lay_season,fun_fact,wingspan_cm,f_id FROM birds
     INNER JOIN bird_families ON birds.f_id = bird_families.family_id`;

    if(sort_byfirst && !sortbyGreenList1.includes(sort_byfirst)){
        return Promise.reject({status: 400, message: 'Invalid sort_byfirst query string'})
    }

    if(sort_bysecond && !sortbyGreenList2.includes(sort_bysecond)){
        return Promise.reject({status: 400, message: 'Invalid sort_bysecond query string'})
    }

    if(order1 && !orderbyGreenList.includes(order1.toUpperCase())){
        return Promise.reject({status: 400, message: 'Invalid order1 query string'})
    }

    if(order2 && !orderbyGreenList.includes(order2.toUpperCase())){
        return Promise.reject({status: 400, message: 'Invalid order2 query string'})
    }
   
    if(diet){
        queryValues.push(`%${diet}%`)
        queryStr += ` WHERE diet ILIKE $1`;
    }

    if(sort_byfirst){//AMEND HERE
        queryStr += ` ORDER BY ${sort_byfirst}`;  

    }
 
    if(order1 && sort_byfirst){
        queryStr += ` ${order1.toUpperCase()}`;
    }

    if(order2 && sort_bysecond && sort_byfirst){
        queryStr += `, ${sort_bysecond} ${order2.toUpperCase()}`;
    }

    return db.query(queryStr,queryValues).then((result)=>{
        if(!(result.rows.length)){
            return Promise.reject({status: 404, err: 'No results found for query'})

        }else{
            return result.rows
        }
    })
}
javascript node.js postgresql express jestjs
1个回答
1
投票

err
未在
404
上设置,需要通过响应状态推断。

更换

app.use(handleNotFound)

用类似的东西

app.use((req, res, next) => {   
    res.status(404).send({ message: 'HTTP 404 error: path cannot be found' });
});
© www.soinside.com 2019 - 2024. All rights reserved.