Node.js ';app.address不是一个函数';测试express HTTPS服务器时

Node.js ';app.address不是一个函数';测试express HTTPS服务器时,node.js,express,unit-testing,https,jestjs,Node.js,Express,Unit Testing,Https,Jestjs,我在测试express应用程序时遇到问题。所有教程都使用app.listen而不是https.createServer,我不知道如何正确地将测试框架用于后者。守则: 测试节点/app.js var express=require(“express”); 常量app=express(); 应用程序集('port',process.env.SERVER_port | | 443); app.get('/',函数(req,res){ res.status(200)。发送('OK'); }); modu

我在测试express应用程序时遇到问题。所有教程都使用
app.listen
而不是
https.createServer
,我不知道如何正确地将测试框架用于后者。守则:

测试节点/app.js

var express=require(“express”);
常量app=express();
应用程序集('port',process.env.SERVER_port | | 443);
app.get('/',函数(req,res){
res.status(200)。发送('OK');
});
module.exports={
app:app
}
测试节点/server.js

var https=require('https');
var fs=需要('fs');
const-app=require('./app');
让服务器选项={
key:fs.readFileSync('./cert/server.key'),
证书:fs.readFileSync('./cert/server.cert')
}
const server=https.createServer(服务器选项,应用程序)
server.listen(app.get('port')、函数(){
log(`expressHTTPS服务器正在侦听端口${app.get('port')}`);
});
异步函数handleSignal(信号){
log(`Received${signal}`);
server.close();
process.exit();
}
进程。on('SIGINT',handleSignal);
过程。on('SIGTERM',handleSignal);
进程.on('uncaughtException',handleSignal);
测试节点/test/test.js

const request=require('supertest'))
描述(“测试根路径”,()=>{
让服务器;
beforeAll(函数(){
server=require('../app');
});
毕竟(功能){
server.close();
});
test(“它应该响应GET方法”,async()=>{
const response=等待请求(服务器).get(“/”;
expect(response.statusCode).toBe(200);
});
});
测试节点/package.json

{
“名称”:“测试节点”,
“版本”:“1.0.0”,
“说明”:“,
“main”:“server.js”,
“脚本”:{
“开始”:“node server.js”,
“测试”:“开玩笑”
},
“作者”:“作者”,
“许可证”:“ISC”,
“依赖性”:{
“笑话”:“^26.6.3”,
“超级测试”:“^6.1.3”
},
“依赖项”:{
“快速”:“^4.17.1”
}
}
使用jest测试上述代码时出现的错误(
jest--runInBand test.js
):

但是,如果我将所有代码放在相同的
app.js
文件中,并运行
node app.js
,则应用程序启动正常,尽管测试会产生相同的错误

测试节点/app.js

var https=require('https');
var fs=需要('fs');
var express=要求(“快递”);
var服务器;
常量app=express();
应用程序集('port',process.env.SERVER_port | | 443);
app.get('/',函数(req,res){
res.status(200)。发送('OK');
});
异步函数handleSignal(信号){
log(`Received${signal}`);
server.close();
process.exit();
}
进程。on('SIGINT',handleSignal);
过程。on('SIGTERM',handleSignal);
进程.on('uncaughtException',handleSignal);
让服务器选项={
key:fs.readFileSync('./cert/server.key'),
证书:fs.readFileSync('./cert/server.cert')
}
server=https.createServer(serverOptions,app).listen(app.get('port')),function(){
log(`expressHTTPS服务器正在侦听端口${app.get('port')}`);
});
module.exports={
app:app,
服务器:服务器
}

为了澄清,我的问题是如何修复jest测试中的错误,而不是运行
node server.js
时的错误-后者只是用于上下文。

正如@jornsharpe在评论中指出的,我假设使用
module.exports
我导出应用程序本身,但事实上我导出了包含该应用程序的对象。因此,为了修复测试错误,我只需在我的test.js中编写:

server = require('../app').app;
而不是
server=require('../app')。类似地,在server.js中,我不得不写:

const app = require('./app').app;
这修复了我在问题中提到的两个错误(
TypeError:app.address不是函数


感谢@jornsharpe帮助我找到解决方案

为什么要测试express?看起来您已经做了很多研究,这是很好的,但这使得很难判断哪些特定组合会产生哪些特定错误。我希望将应用程序和服务器分开,并使用supertest只测试前者。@LawrencerOne我正在测试我的express server应用程序,而不是一般的express。@jonrsharpe请建议我需要如何做。如前所述,我尝试了各种组合,得到了不同的错误。如果我发布所有我做的组合,问题会变得太长。谢谢!同样,您可以记录它(
console.log(app)
)或使用调试器(指令因IDE而异)。导出对象本身没有问题,但是在从app.js导入的文件中,您假定导出了应用程序本身,而不是包含它的对象。这就是为什么它不能从测试或服务器上运行。
server = require('../app').app;
const app = require('./app').app;