最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

在Firebase功能上运行Mocha的问题

网站源码admin42浏览0评论

在Firebase功能上运行Mocha的问题

在Firebase功能上运行Mocha的问题

我编写了一个Node / Typescript应用程序,该应用程序使用了Firebase Cloud Firestore中的数据。该应用程序运行完美,我能够使用生成的.js文件的简单mocha命令对端点进行良好的测试。这是测试脚本之一的示例:

import * as supertest from 'supertest'
import app from '../App'

describe('Risk API', () => {
  it('works to get /', () =>
    supertest(app)
      .get('/risks')
      .expect('Content-Type', /json/)
      .expect(200)
  )
  it('does not allow put at top level', () =>
    supertest(app)
      .put('/risks')
      .expect(403)
  )
})

这里是引用的App.js(不包括导入和声明):

let riskRouter = require('./routes/Risk')

class App {
  public express

  constructor () {
    this.express = express()
    this.mountRoutes()
  }

  private mountRoutes (): void {
    const router = express.Router()

    router.get('/', (req, res) => {
      res.json({
        message: 'Hello World!'
      })
    })
    this.express.use(bodyParser.json());
    this.express.use(cors({ origin: true }))
    this.express.use('/', router)
    this.express.use('/risks', functions.https.onRequest(riskRouter))
  }
}

export default new App().express

这里是仅具有GET端点的Risk路由器:

const express = require('express');
const bodyParser = require('body-parser');
const riskRouter = express.Router();
import { firestore, firebasestore } from '../firebase/firebase';


riskRouter.use(bodyParser.json());

riskRouter.route('/')
.get((req,res,next) => {
    return firestore.collection('risks').get()
    .then(snapshot => {
        let risks = [];
        snapshot.forEach(doc => {
            const data = doc.data()
            const _id = doc.id
            risks.push({_id, ...data });
        });
        res.send(risks)
    })
    .catch( err => res.json({error: err}))
})

// POST, PUT and DELETE are implemented here but not needed for this discussion

module.exports = riskRouter

[当我尝试将其迁移到Firebase时,我基本上将整个节点应用程序复制到/ functions目录,并对App.ts文件进行了以下更改

let riskRouter = require('./routes/Risk')

class App {
  public express

  constructor () {
    this.express = express()
    this.mountRoutes()
  }

  private mountRoutes (): void {
    const router = express.Router()

    router.get('/', (req, res) => {
      res.json({
        message: 'Hello World!'
      })
    })
    this.express.use(bodyParser.json());
    this.express.use(cors({ origin: true }))
    this.express.use('/', router)
    this.express.use('/risks', functions.https.onRequest(riskRouter))
  }
}

export default new App().express

[在两种情况下,package.json中的测试命令都是“ test”:“ tsc && mocha lib / ** / *。spec.js”

此外,Risk路由器在两种情况下都是相同的。

在可行的情况下,所有测试都运行良好。此外,他们正在拨打外部Firebase后端

在失败的情况下,我得到以下输出:风险API1)取得/

0通过(2s)1个失败

1)Risk API可以获取/:错误:超时超过2000毫秒。对于异步测试和挂钩,请确保调用了“ done()”;如果返回承诺,请确保其解决。在listOnTimeout上(internal / timers.js:549:17)在processTimers(internal / timers.js:492:7)

我所有的端点都使用某种形式的res.send(),res.json()等,我读到的就足够了,不需要显式使用done()。如果我错了,我想知道以及修复它的正确语法。

我也尝试使用--timeout 15000选项直接在生成的测试脚本上运行mocha,但结果相同。

任何建议将不胜感激!

回答如下:

您可以尝试以下操作:

import * as supertest from 'supertest'
import app from '../App'

describe('Risk API', (done) => {
  it('works to get /', () =>
    supertest(app)
      .get('/risks')
      .expect('Content-Type', /json/)
      .expect(200, done)
  )
  it('does not allow put at top level', (done) =>
    supertest(app)
      .put('/risks')
      .expect(403, done)
  )
})
发布评论

评论列表(0)

  1. 暂无评论