簡體   English   中英

如何使用 Jest 設置和拆卸 Web 服務器

[英]How to setup and teardown a Web server with Jest

我正在使用 Jest,需要設置一個 Web 服務器來運行測試,然后再將其拆除。

我該如何實施?

您可以使用beforeAllafterAll Jest 全局方法來執行此操作。

  1. 創建一個定義設置和拆卸功能的模塊:
// server.js
import Fastify from 'fastify';

const fastify = Fastify({
    logger: false
});

const PORT = process.env.PORT || 8080;

function startServer()
{
    return new Promise(function (resolve) {
        fastify.get('/init', function(req, res){
            res.status(200).send('INIT');
        });

        fastify.listen(PORT, function(err, addr)
        {
            if(err)
            {
                console.log(err);
                process.exit(1);
            }

            resolve(addr);
        }); 
    });
}

function endServer()
{
    return new Promise(function (resolve) {
        fastify.close(resolve);
    });
}

export {startServer, endServer};
  1. 創建一個模塊以從正在運行的服務器獲取數據:
// fetch.js

import fetch from 'node-fetch';

async function get(url_str, opts_obj)
{
    let res = await fetch(url_str);
    return (opts_obj && opts_obj.json) ? await res.json() : await res.text();    
}

export {get};
  1. 創建測試文件:
// main.test.js

import { startServer, endServer } from './server.js';
import { get } from './fetch.js';

beforeAll(function(){
    console.log('Jest - beforeAll()');
    return startServer().then(function(addr){
        console.log('Server started!');
        console.log(`Web server listening on ${addr}!`);
    });
});

test('Get data from server', async function(){
    let res = await get('http://localhost:8080/init');
    expect(res).toBe('INIT');
});

afterAll(function(){
    console.log('Jest - afterAll()');
    return endServer().then(function(){
        console.log('Server closed!');
    });
});
  1. 從命令行運行測試:
npx jest main 

注意:鑒於我們使用的是 ES 模塊,我們必須在jest命令前加上前綴:

 NODE_OPTIONS=--experimental-vm-modules npx jest main

通過 Jest 文檔查看ECMAScript 模塊

您還可以使用現代異步/等待語法:

  1. 更新server.js模塊:
// server.js

import Fastify from 'fastify';

const fastify = Fastify({
    logger: false
});

const PORT = process.env.PORT || 8080;

async function startServer()
{
    fastify.get('/init', function(req, res){
        res.status(200).send('INIT');
    });

    return await fastify.listen(PORT);
}

async function endServer()
{
    return await fastify.close();
}

export {startServer, endServer};

  1. 更新main.test.js
// main.test.js

import { startServer, endServer } from './server.js';
import { get } from './fetch.js';

beforeAll(async function(){
    console.log('Jest - beforeAll()');
    let addr = await startServer();
    console.log(`Server listening on ${addr}!`);
});

test('Get data from server', async function(){
    let res = await get('http://localhost:8080/init');
    expect(res).toBe('INIT');
});

afterAll(async function(){
    console.log('Jest - afterAll()');
    await endServer();
});

  1. 像上面的4.一樣運行 jest 命令。

注意typepackage.json中的module ,即 Node.js 將 .js 文件解釋為 ES 模塊。 這就是我們可以使用import語法的原因。

注意:安裝了以下依賴項:

  • fastify
  • node-fetch

注意:Fastify 被用作 Web 服務器,因為它有一個close方法,這使得關閉服務器看起來很簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM