繁体   English   中英

我可以像常规 js 文件一样运行 jest 测试吗?

[英]Can I run jest tests as regular js files?

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

此处给出了 jest 提供的全局变量的完整列表。

技术上可行吗? 是的。

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

背景

Jest 是一个测试工具

Jest 不是唯一使用describe()it()测试工具。 这些是行为驱动开发 (BDD) 的典型测试关键字。 您还会发现它们与Mocha和其他产品一起使用。

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

为什么你不应该用 Jest 来做这件事

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

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

你可以如何用 Jest 来尝试

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

Circus 导出了describe()it()和其他一些关键字,尽管这些对我们来说并不是真正有用,因为这些函数仅在内部创建测试套件和测试用例,但不会向我们公开它们或给我们提供运行它们的方法.

Jasmine2 导出一个可执行函数,该函数返回测试结果的 Promise jasmineAsyncInstall代码在 env 或全局中创建了大部分关键字,您或许可以使用这些关键字。

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

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

为什么这不重要

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

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

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

使用水龙头胶带 这些旨在以您想要的方式运行,并且是可配置的。

例子:

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

我必须做很多研究才能找到正确的图书馆。

到目前为止,我找到的最合适的是Jest Lite 这家伙做得很好。

我找到的另一个解决方案是使用Chai.js的变通方法。 安装 chai 并从库中导入 expect。 运行期望语句。 不幸的是,它不会返回 promise 或结果。 您只需拨打 try-catch 即可完成工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM