【问题标题】:"top level" test in jest开玩笑的“顶级”测试
【发布时间】:2020-10-02 15:28:45
【问题描述】:

在开玩笑地编写集成测试时,我想通过以下方式重现我在 mocha 中实现的相同行为: mocha -r ts-node/register tests/integration/topLevelTest.test.ts 'tests/integration/**/*.test.ts'.

topLevelTest.test.ts:

let importantVariable;

describe("should do something with my variable", () => {
  importantVariable = returnSomethingImportant();

  it("should important variable exists", () => {
    should.exist(importantVariable)
  })
})

after(() => {
  importantVariable.cleanUp()
})

行为很简单:首先 topLevelTest 执行 describe,然后其他测试套件自己执行,最后 after 在 topLevelTest 内执行。

在我尝试改写它以开玩笑时,我写了一些非常相似的东西。唯一的区别是我使用了 afterAll 而不是 after。结果是:首先执行 topLevelTest 描述,然后执行 afterAll,然后执行其他测试套件。是否可以让 afterAll 在其他测试套件之后运行?

【问题讨论】:

    标签: node.js jestjs


    【解决方案1】:

    这就是设置文件的用途,更具体地说是setupFilesAfterEnv,因为 Jest 环境已经在那里初始化,全局变量可用。

    未与describe 分组的顶级afterAll 适用于当前测试套件中的所有测试。由于 Jest 测试在不同线程中并行运行(除非指定了 runInBand 选项),因此显然不会影响其他测试套件。

    如果设置失败且不需要继续进行测试并且不需要来自设置的数据,则应使用globalSetup 和 globalTeardown 配置选项。这不是测试,但主要区别在于 describe 和单独的 test 块不可用。全局期望不可用,但可以导入,如果设置失败,这会导致有意义的错误:

    // setup.js
    let expect = require('expect');
    module.exports = async () => {
      let server = ...;
      expect(server)...;
      global.__MYSERVER__ = server;
    };
    
    // teardown.js
    module.exports = async function () {
      // close __MYSERVER__
    };
    

    由于全局设置和拆卸在父进程中运行,__MYSERVER__ 无法在测试中访问。

    【讨论】:

    • 这种方法的问题是我想测试一次我的重要变量是否已正确定义并且在所有测试套件都正确清理之后。将它与 setupFilesAfterEnv 一起使用还会不必要地记录许多其他相同的重要变量测试(例如“应该对我的变量做某事”和“重要的变量应该存在”)
    • 问题缺少上下文。什么是重要变量以及它是如何使用的?可以做到这一点的方式取决于它。
    • 通过 returnSomethingImportant() 我在另一个进程中创建了一个 src/,它设置了我的 nodejs 服务器,然后设置了重要变量的侦听器,它等待该进程中的特定日志(“服务器开始”)然后测试通过(例如“重要变量是否存在”)。毕竟我只是简单地杀死了那个进程,所以我需要参考它。
    • setupFilesAfterEnv before/afterAll 为每个测试文件运行。它们在子进程中同时运行,这是 Jest 的主要好处之一,因此从 Jest 的角度来看,期望在所有测试之前运行一次的测试是没有意义的(除非您使用 runInBand,这应该作为最后的手段)。
    • 如果您不需要与测试共享重要变量并保留它只是为了清理,那么您可以在测试开始之前设置服务器并在父进程中将其关闭一次,请参阅stackoverflow.com/a/62609902/3731501。这不是一个测试,因为 Jest 环境在那里不可用,但您需要使用与测试中相同的语法进行断言,使用 require('expect') 而不是全局 expect
    猜你喜欢
    • 2022-07-26
    • 1970-01-01
    • 2020-02-06
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 2018-09-25
    相关资源
    最近更新 更多