最好从模块运行所有代码,而不仅仅是运行导入的函数

问题描述 投票:1回答:2

这是我的index.js文件,位于./src目录中:

import { MongoClient } from "mongodb";

import CharacterDAO from "./dao/character";
import GearDAO from "./dao/gear";

import { startServer } from "./server";
import { seedData } from "./dataSeed";

// connect mongoDb, seed data if needed, run fastify server
export const runServer = async ({ dbUrl, dbName, environment, port }) => {
  // test seed data when starting server if running a test suite
  if (environment === "test") {
    await seedData({
      hostUrl: dbUrl,
      databaseName: dbName
    });
  }

  await MongoClient.connect(dbUrl, {
    poolSize: 50,
    useNewUrlParser: true,
    useUnifiedTopology: true,
    wtimeout: 2500
  })
    .then(async conn => {
      const database = await conn.db(dbName);
      // inject database connection into DAO objects
      CharacterDAO.injectDB(database);
      GearDAO.injectDB(database);
      // start the fastify server
      startServer(port);
    })
    .catch(err => {
      console.log(err.stack);
      // process.exit(1);
    });
};

const serverArguments = process.argv.slice(2).map(arg => {
  return arg.split("=")[1];
});

const serverOptions = {
  dbUrl: serverArguments[0],
  dbName: serverArguments[1],
  environment: serverArguments[2],
  port: serverArguments[3]
};

runServer({
  ...serverOptions
});

jestconfig.json

{
  "transform": {
    "^.+\\.(t|j)sx?$": "ts-jest"
  },
  "testEnvironment": "node",
  "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
  "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"]
}

来自用于运行测试的package.json中的测试脚本(省略了数据库凭据)

"test": "dbUrl=mongodb+srv://[email protected]  dbName=untitled-combat-game-test environment=test port=4000 jest --config jestconfig.json"

我的测试文件:

import { runServer } from "../index";

beforeAll(async () => {
  const serverOptions = {
    dbUrl: process.env.dbUrl,
    dbName: process.env.dbName,
    environment: process.env.environment,
    port: process.env.port
  };

  console.log(serverOptions);

  await runServer({
    ...serverOptions
  });
});

describe("mock test", () => {
  it("should run a basic test", () => {
    expect(true).toBe(true);
  });
});

我运行测试时会发生什么:

  • 测试脚本运行runServer
  • index.js文件运行runServer

这将导致无效的URI错误(因为index.js中引用的process.argv不包含有效的mongodb URI)。我通过注释掉index.js文件底部的runServer调用进行了仔细检查-一切正常。

runServer功能移动到其他文件并从那里导入它也解决了该问题。因此,同时导入index.js和测试文件不会导致多次调用。

我在做什么错?

node.js jest
2个回答
1
投票

我将服务器的定义拆分,然后将服务器调用到两个不同的文件中,例如server.jsindex.js。我将把进口的修理工作留给您,但这是个主意:

server.js

// connect mongoDb, seed data if needed, run fastify server
export const runServer = async ({ dbUrl, dbName, environment, port }) => {
  // test seed data when starting server if running a test suite
  if (environment === "test") {
    await seedData({
      hostUrl: dbUrl,
      databaseName: dbName
    });
  }

  await MongoClient.connect(dbUrl, {
    poolSize: 50,
    useNewUrlParser: true,
    useUnifiedTopology: true,
    wtimeout: 2500
  })
    .then(async conn => {
      const database = await conn.db(dbName);
      // inject database connection into DAO objects
      CharacterDAO.injectDB(database);
      GearDAO.injectDB(database);
      // start the fastify server
      startServer(port);
    })
    .catch(err => {
      console.log(err.stack);
      // process.exit(1);
    });
};

index.js

import { runServer } from './server';

const serverArguments = process.argv.slice(2).map(arg => {
  return arg.split("=")[1];
});

const serverOptions = {
  dbUrl: serverArguments[0],
  dbName: serverArguments[1],
  environment: serverArguments[2],
  port: serverArguments[3]
};

runServer({
  ...serverOptions
});


0
投票

导入/请求文件将评估文件中的代码(阅读:运行文件中的代码)。从技术上讲,您没有做错任何事情,但是出于测试目的,编写的代码无法正常工作。

index.js文件中,您正在执行runServer()。每当导入/需要该文件时,该函数调用也会运行。

具有start.js文件或类似文件实际上将启动您的服务器是一种常见的模式。这将帮助您避免遇到的问题。

© www.soinside.com 2019 - 2024. All rights reserved.