Javascript 如何使用TestenEnvironment作为NodeEnvironment启动express服务器?

Javascript 如何使用TestenEnvironment作为NodeEnvironment启动express服务器?,javascript,express,jestjs,Javascript,Express,Jestjs,在研究了这些问题之后: 我能够做到这一点: package.json { "name": "my-project", "jest": { "testEnvironment": "./testEnvironment.js", } } testEnvironment.js const express=require('express'); //const NodeEnvironment=require('jest-environment-n

在研究了这些问题之后:

  • 我能够做到这一点:

    package.json

    {
      "name": "my-project",
      "jest": {
        "testEnvironment": "./testEnvironment.js",
      }
    }
    
    testEnvironment.js

    const express=require('express');
    //const NodeEnvironment=require('jest-environment-node');//用于服务器节点应用程序
    const NodeEnvironment=require('jest-environment-jsdom');//用于浏览器js应用程序
    类ExpressEnvironment扩展了NodeEnvironment{
    构造函数(配置,上下文){
    超级(配置,上下文);
    }
    异步设置(){
    等待super.setup();
    常量app=express();
    this.global.server=app.listen(0,“127.0.0.1”,()=>{
    log(`Running express server on'${JSON.stringify(server.address())}'…`);
    如何使setup()等待app.listen回调完成,
    i、 例如,服务器已正确启动。
    });
    app.use(express.static('../testfiles'));
    }
    异步拆卸(){
    this.global.server.close();
    等待super.teardown();
    }
    运行脚本(脚本){
    返回super.runScript(script);
    }
    }
    module.exports=ExpressEnvironment;
    
    如何使
    setup()
    等待
    app.listen()
    回调完成,即服务器已正确启动

    以前,当我使用
    beforeAll()
    时,我的代码工作正常,因为我可以使用
    done()
    通过
    beforeAll()传递的异步回调:

    const express=require('express');
    常量app=express();
    var服务器;
    之前(异步(完成)=>{
    服务器=app.listen(0,“127.0.0.1”,()=>{
    log(`Running express server on'${JSON.stringify(server.address())}'…`);
    完成();
    });
    app.use(express.static('../testfiles'));
    });
    毕竟(()=>{
    server.close();
    });
    

    如何等效于NodeEnvironment
    setup()
    函数上的beforeAll
    done()
    回调?

    您可以通过等待listen,将其包装在承诺中,并调用承诺解析作为对服务器listen的回调来实现这一点

    const-app=express();
    让服务器;
    等待新的承诺(resolve=>server=app.listen(0,“127.0.0.1”,resolve));
    this.global.server=服务器;
    
    您还可以设置一个自定义回调,该回调只调用promise resolver作为
    应用程序的第三个参数。listen()
    ,它应该运行该代码,然后在需要某种诊断时调用resolve。

    扩展答案:

    您还可以放置一个自定义回调函数,该函数将只调用promise resolver作为
    app.listen()
    的第三个参数,它应该运行该代码,然后在需要某种诊断时调用resolve

    let服务器;
    常量app=express();
    等待新承诺(功能(解决){
    服务器=app.listen(0,“127.0.0.1”,函数(){
    log(`Running express server on'${JSON.stringify(server.address())}'…`);
    解决();
    });
    });
    this.global.server=服务器;
    
    然后,您可以访问测试文件中的
    this.global.server
    ,以获取服务器端口/地址: