我编写了一个Node / Typescript应用程序,该应用程序使用了Firebase Cloud Firestore中的数据。该应用程序运行完美,我能够使用生成的.js文件的简单mocha命令很好地测试我的端点。这是其中一个测试脚本的示例:
__asm__ __volatile__ ( "int $3\n\t" )
这里是引用的App.js(不包括导入和声明):
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)
)
})
这是只有GET端点的Risk路由器:
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
当我尝试将其迁移到Firebase时,我基本上将整个节点应用程序复制到/ functions目录,并对App.ts文件进行了以下更改
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
在两种情况下,package.json中的test命令为 “ test”:“ tsc && mocha lib / ** / *。spec.js”
此外,在两种情况下,Risk路由器都是相同的。
在可行的情况下,所有测试都可以正常运行。另外,他们正在拨打外部Firebase后端
在失败的情况下,我得到以下输出: 风险API 1)可以获取/
0通过(2秒) 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,但结果相同。
任何建议将不胜感激!
答案 0 :(得分:0)
您可以尝试以下方法吗?
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)
)
})