我可以 运行 将 jest 测试作为常规 js 文件吗?

Can I run jest tests as regular js files?

Jest 使用 describeitexpect,而您不必 require。这没关系,因为如果您有一个名为 test.spec.js 的测试文件,您将永远不会通过发出命令 node test.spec.js.

直接执行它

我想使用 node 作为标准 js 文件来执行它,而不必使用 jest 的 cli 或 npm test。可以吗?

例如,我将转换以下文件:

// taken from documentation
const user = require('./users.js')
it('works with promises', () => {
  expect.assertions(1);
  return user.getUserName(4).then(data => expect(data).toEqual('Mark'));
});

类似于

var {describe, it, expect} = require('jest-primitives') 
const user = require('./users.js')
it('works with promises', () => {
  expect.assertions(1);
  return user.getUserName(4).then(data => expect(data).toEqual('Mark'));
});

所以它是一个独立的js文件,可以运行使用node.

给出了 jest 提供的完整全局列表 here

技术上可行吗?是的。

应该吗?可能不会。 (但还有更好的方法 - tl;dr 使用 tape

背景

Jest 是 test harness

Jest 不是唯一使用 describe()it() 的测试工具。这些是 behavior-driven development (BDD). You'll also find them used with Mocha 和其他人的典型测试关键字。

describe()it() 是与测试工具交互的函数,分别告诉它添加一个测试套件和一个测试用例。测试工具然后 运行s 测试用例,收集结果,格式化结果并输出它们。

为什么你不应该用 Jest 做这个

一般来说,您应该尽可能地地道地使用技术。这使其他人更容易阅读、理解和使用您的技术。

特别是,以这种方式使用 Jest 将是自我实现的、hacky、错误的,并且对于不熟悉您的代码的人来说通常是难以理解的。话虽如此,应该是可以的。

您可以如何使用 Jest 进行尝试

Jest 在他们的 Jest monorepo 中定义了 运行ner 包。一个是 Circus, the other is Jasmine2

Circus exports describe(), it() and some other keywords,尽管这些对我们来说并不是真正有用,因为这些功能仅在内部创建测试套件和测试用例,但不会将它们暴露给我们或给我们一个方法 运行 他们。

Jasmine2 exports an executable function which returns a Promise of a test result. The code for jasmineAsyncInstall 在环境中或全局创建了大部分关键字,您也许可以使用它们。

你想在这里做的是定义 it()describe() 函数,无论是全局的,作为导出(如果你想在问题的代码示例中使用它们), 或者通过在主模块的范围内定义它们来巧妙地定义它们。这些功能应该注册测试用例和测试套件。您需要跟踪测试用例并稍后 运行 它们,或者立即 运行 它们并跟踪测试结果。

现在的问题在于确定测试模块何时完成 运行ning。也就是说,当所有 describe()it() 都已执行(无论测试用例本身是否已执行),以及任何其他事件代码(不在任何块中的代码)。没有好的方法来处理这个问题,这里可能会再次出现问题。最简单的方法可能是向 process.on('exit' 添加一个侦听器。

为什么那不重要

测试工具通常只是测试 运行ner 和 reporter。特别是 Jest,它只是组件的集合,所有组件都是可配置的。

如果我们只是从 Jest 那里拉一个函数,那里拉一个变量,我们真的可以说我们还在使用它吗?为什么我们甚至想要?真的没有理由在这里使用 Jest。如果您不喜欢它 运行 的测试方式,您应该使用不同的测试工具,而不是尝试修改它。如果你喜欢记者,Jestexports a package containing only the reporter

制作测试文件的更好方法运行可用

使用tap or tape。这些被设计为 运行 您想要的方式,并且是可配置的。

示例:

const test = require('tape');
const MyClass = require('../src/my-class');

test('MyClass.doSometing should be true', (t) => {
    const result = MyClass.doSomething();

    if (result === true) {
      t.pass('The test passed! Hooray! Our class MyClass is seemingly error-free!');
    } else {
      t.fail('Oh noes. Our test has failed. Why am I such a bad programmer....?');
    }

    t.end();
});