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

原文 标签 javascript node.js jasmine jestjs

开 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.js 运行。

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

最佳答案

技术上可行吗?是的。

你应该?可能不是。 (但有更好的方法 - tl;博士使用 tape )

背景

开 Jest 是 test harness .

Jest 不是唯一使用的测试工具 describe()it() .这些是 behavior-driven development (BDD) 的典型测试关键字。 .您还会发现它们与 Mocha 一起使用。和别的。
describe()it()是与测试工具交互的函数,告诉它分别添加一个测试套件和一个测试用例。然后测试工具运行测试用例,收集结果,格式化结果并输出它们。

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

通常,您应该尽可能地习惯性地使用技术。这使其他人更容易阅读、理解和使用您的技术。

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

你如何用 Jest 来尝试

Jest 在他们的 Jest monorepo 中定义了运行程序包。一种是Circus ,另一个是Jasmine2 .

马戏团 exports describe() , it() and some other keywords ,尽管这些对我们来说并不是真正有用的,因为这些函数只是在内部创建测试套件和测试用例,但不会向我们公开它们或给我们运行它们的方法。

Jasmine 2 exports an executable function其中returns a Promise of a test result . code for jasmineAsyncInstall在 env 或全局中创建大多数关键字,您也许可以使用这些关键字。

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

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

为什么这无关紧要

测试工具通常只是一个测试运行者和一个报告者。特别是,Jest 只是组件的集合,所有这些都是可配置的。

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

使测试文件可运行的更好方法

使用taptape .这些旨在按照您想要的方式运行,并且是可配置的。

例子:

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();
});

关于javascript - 我可以将 jest 测试作为常规 js 文件运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60232563/

相关文章:

javascript - jQuery输入:选中显示和隐藏div函数

javascript - 制作谷歌带注释的时间线 为缺失的日期填充零

node.js - Node js中的构造函数内部的对象解构以将值分配给成员变量不起作用

javascript - Jasmine - 监视构造函数中的方法调用

jquery - AngularJS单元测试DateTimePicker

Angular/Jasmine - 如果在 ngOnInit 上调用 Spies 是否工作?

javascript - VueJS-无法将 Prop 从父组件传递到子组件

javascript - 循环浏览一组图像?

javascript - 如何使用 NodeJS Express 服务器在 HTML 中包含 JS 文件?

node.js - hapi-auth-jwt2 作品在 hapi.js 应用程序中不起作用?