Как протестировать конечные точки API сервера с помощью скаффолдинга приложения Nuxt с Express? - PullRequest
0 голосов
/ 21 февраля 2020

При создании приложения Nuxt с использованием create-nuxt-app есть возможность добавить и внутренний сервер, и среду тестирования.

Я выбрал Express в качестве основы сервера, а Jest - в качестве моего тестирования. фреймворк, который позволяет мне отлично выполнять тесты с Jest. Однако нет доступного примера тестирования на стороне сервера, в котором вы можете протестировать конечные точки API.

Я создал конечную точку API /api/threads и попытался протестировать ее примерно так:

const request = require('supertest')
const app = require('../app')

describe('GET /api/threads', () => {
  it('should return 200', async () => {
    await request(app)
      .get(`/api/threads`)
      .expect(200)
  })
})

Но я вернулся с ошибкой: VueRenderer is not a constructor

Я также убедился в экспорте app.js, который в настоящее время выглядит следующим образом:

require('dotenv-safe').load()
const path = require('path')
const express = require('express')
const consola = require('consola')
const bodyParser = require('body-parser')
const bcrypt = require('bcryptjs')
const session = require('express-session')
const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy
const SequelizeStore = require('connect-session-sequelize')(session.Store)
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY)
const { Nuxt, Builder } = require('nuxt')

// Import and Set Nuxt.js options
const config = require('../nuxt.config.js')
const sequelize = require('./sequelize')
const models = require('./models')
const router = require('./router')
const controllers = require('./controllers')

const app = express()

config.dev = !(
  process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'test'
)

function addSessions() {
  const sessionStorage = new SequelizeStore({
    db: sequelize
  })

  app.use(
    session({
      secret: process.env.SESSION_SECRET,
      resave: false,
      saveUninitialized: false,
      store: sessionStorage
    })
  )
  app.use(passport.initialize())
  app.use(passport.session())
  sessionStorage.sync()
}

function addLocalStrategy() {
  passport.use(
    new LocalStrategy(
      {
        usernameField: 'email',
        passwordField: 'password'
      },
      async (email, password, done) => {
        try {
          let user = await models.User.findOne({ where: { email } })

          if (!user)
            return done(null, false, {
              message: 'Incorrect email.'
            })

          user = user.toJSON()

          const passValid = await bcrypt.compare(
            password,
            user.password.toString('utf8')
          )
          if (passValid === false)
            return done(null, false, {
              message: 'Incorrect password.'
            })

          if (user && user.subscriptionId) {
            const subscription = await stripe.subscriptions.retrieve(
              user.subscriptionId
            )
            user.subscriptionStatus = subscription.status
          }

          return done(null, user)
        } catch (err) {
          console.log(err)
          return done(err)
        }
      }
    )
  )

  passport.serializeUser((user, done) => {
    done(null, user.id)
  })

  passport.deserializeUser(async (id, done) => {
    try {
      const user = await models.User.findById(id)

      done(null, user)
    } catch (err) {
      throw new Error(err)
    }
  })
}

async function start() {
  try {
    const nuxt = new Nuxt(config)
    const { host, port } = nuxt.options.server

    // Build only in dev mode
    if (config.dev) {
      const builder = new Builder(nuxt)
      await builder.build()
    } else {
      await nuxt.ready()
    }

    app.use(bodyParser.json())
    app.use(bodyParser.urlencoded({ extended: false }))

    addSessions()
    addLocalStrategy()
    app.use('/', router)
    app.use('/private', controllers.User.authenticate)
    app.use('/private', express.static(path.join(__dirname, 'private')))

    // Give nuxt middleware to express
    app.use(nuxt.render)

    app.listen(port, host)
    consola.ready({
      message: `Server listening on http://${host}:${port}`,
      badge: true
    })
  } catch (err) {
    throw new Error(err)
  }
}
start()

module.export = app

По сути, это леса server/app.js , но с кодом для сеансов и аутентификации.

Любые идеи о том, как успешно получить ответ 200 при попадании в конечную точку бэкэнд-API с помощью комбинации Nuxt / Express?

...