[英]Can I run jest tests as regular js files?
Jest 使用describe
和it
以及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 将是自我实现的、hacky 的、错误的,并且对于不熟悉您的代码的任何人来说通常都无法理解。 话虽这么说,应该是可以的。
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();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.