【问题标题】:Problems running mocha on Firebase functions在 Firebase 函数上运行 mocha 时出现问题
【发布时间】:2020-08-31 08:59:14
【问题描述】:

我编写了一个使用 Firebase Cloud Firestore 数据的 Node/Typescript 应用。该应用程序运行良好,我能够使用生成的 .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 端点的风险路由器:

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 中的测试命令都是 “测试”:“tsc && mocha lib/**/*.spec.js”

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

在可行的情况下,所有测试都可以干净地运行。此外,他们正在调用外部 Firebase 后端

在失败的情况下,我得到以下输出: 风险 API 1) 努力得到 /

0 次通过 (2s) 1 次失败

1) 风险 API 用于获取 /: 错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保调用了“done()”;如果返回 Promise,请确保它已解决。 在 listOnTimeout (internal/timers.js:549:17) 在 processTimers (internal/timers.js:492:7)

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

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

任何建议将不胜感激!

【问题讨论】:

  • 当你说:I was able to test my endpoints fine 你确定吗?也许您只是在定义测试用例并认为测试运行成功?
  • 我不清楚 res.json() 或 res.data() 与您的测试用例有何关系。您的端点可能会使用它们并且它们不需要 done 调用,但它与您的 mocha 测试有什么关系呢?这是一个不同的代码执行和它的异步,所以它需要在最后“完成”。

标签: node.js typescript firebase mocha.js


【解决方案1】:

您可以尝试以下方法吗:

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

【讨论】:

    猜你喜欢
    • 2016-09-26
    • 2011-11-20
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多