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

标签 javascript node.js jasmine jestjs

Jest 使用describeit 以及expect,而无需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 使用磁带)

背景

开 Jest 是 test harness

Jest 并不是唯一使用 describe()it() 的测试工具。这些是 behavior-driven development (BDD) 的典型测试关键字。您还会发现它们与 Mocha 一起使用。以及其他。

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

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

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

特别是,以这种方式使用 Jest 将会是 self 实现的、hacky 的、有缺陷的,并且对于任何不熟悉你的代码的人来说通常是难以理解的。话虽如此,这应该是可能的。

如何使用 Jest 尝试实现这一点

Jest 在其 Jest monorepo 中定义了runner 包。一是Circus ,另一个是Jasmine2

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

Jasmine 2 exports an executable function其中returns a Promise of a test resultcode for jasmineAsyncInstall在环境或全局中创建大部分关键字,您也许可以使用它们。

您想要在这里做的是定义 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 - 模拟XSS攻击不起作用

javascript - iFrame 中的触摸事件在 iOS 上不起作用

AngularJS 服务测试 (Jasmine/Karma) - 错误 : Unexpected request: GET

javascript - Jasmine 2.0 无法设置回调时的异步测试

javascript - 使用带有可选 https 的 FineUploader?

javascript - 扩展 ng2-pdf-viewer 以支持在 pdf 上绘图的方法?

javascript - 在 Electron 中加载 url 时添加返回按钮

javascript - Angular http.post 发送空 json

node.js - *** Mac 上的 MongoDB 在 fassert() 失败后中止

jasmine - Jasmine headless (headless)Webkit中更好的故障报告