mocha测试中app.js文件导出时碰到问题
发布于 6 年前 作者 Chen-xy 3627 次浏览 最后一次编辑是 5 年前 来自 问答

参考其它测试文档,在学习使用moha及supertest进行单元测试过程中,有这么一句 var app = require(’…/app’); var request = require(‘supertest’)(app); 需要引用到app.js这个文件。 简单的写法,直接在app.js做出module.exports=app即可。 但是现在碰到一个问题 ======================== ===========分割线============================================================ 我的app.js文件,我想在其中有一个检测数据库是否准备好的操作,检测完成后,再进行启动。正常运行没问题。测试过程中,想不出办法拿到app这个对象。 大致代码如下: 1.png 我现在正在思考的问题是怎样才能在app.js这样的环境中,从test获取app这个对象。之前有试过,一直没有尝试好,希望有大神能给说下,Thanks。

10 回复

数据库没准备好,直接var app = express()会报错?

@airyland 不会报错,但是app这个对象在这里不是有get/post等方法嘛,这里是一个包含有方法的对象。中间代码我给省略了,你就当它是一个包含各种方法的对象就好。

@Chen-xy 那不就无所谓了嘛。var app = express()写在数据库连接判断外面就好了呀。 至于数据库是否准备好,就直接在单元测试的before()逻辑里判断就好了。

@airyland 你好,我按照建议尝试了一下,具体方案如下: 方案一:把var app = express()及后续方法写在数据库判断流程外面,可以使用,不过由于异步的原因,大概有百分之30的几率会出现找不到数据库操作方法的情况。 方案二:在测试情况下,app.js中不再写数据库判断方法,数据库判断操作放在test.js文件的before()中进行,运行正常,不过每次运行时都会有大概1s左右的耗时,方案一的耗时则大概在60ms左右。 这个情况正常么? 还有没有更好的方法了。 十分感谢,已经比之前好很多了。

最简单的方法。。global.app = app;然后在外面直接app就行了= =

@Chen-xy “大概有百分之30的几率会出现找不到数据库操作方法的情况”,你是指运行app.js时就报错了,还是说运行后去访问某个url时报错?

@airyland 运行后去访问某个url时报错,报错出在数据模型操作数据库一行,类似于在User.find({name:admin})时出错。应该就是数据库没准备好的原因。

@Chen-xy 你是启动时立即去访问url?合理数据库连接不会太慢的。

@airyland 我运行的是test.js这个文件啊,连接数据库是在app.js中执行,访问url是在test.js文件中执行的,我现在在用方案2了,之前时间长的原因是因为setTimeout等的时间太长了。

@Chen-xy 刚才我有点理解错了。我觉得延时1s算正常的了。我写单元测试时,一般有个bootstrap脚本,也是before里检测到它完成才done。

回到顶部