我可以 运行 将 jest 测试作为常规 js 文件吗?
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.
给出了 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();
});
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.
给出了 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();
});