Rstest 提供兼容 Jest 的 API,这使得从 Jest 项目迁移变得简单。以下是如何将你的 Jest 项目迁移到 Rstest:
首先,你需要安装 Rstest 依赖。
npm add @rstest/core -D接下来,更新 package.json 中的测试脚本,使用 rstest 替代 jest。例如:
"scripts": {
- "test": "jest"
+ "test": "rstest"
}将你的 jest 配置文件(例如 jest.config.js 或 jest.config.ts)更新为 rstest.config.ts 文件:
import { defineConfig } from '@rstest/core';
export default defineConfig({
globals: true,
});以下是一些常见的 Jest 配置及其对应的 Rstest 配置:
| Jest 配置 | Rstest 对等配置 |
|---|---|
testRegex | include |
testMatch | include |
testPathIgnorePatterns | exclude |
transformIgnorePatterns | output.externals、source.exclude |
displayName | name |
rootDir | root |
setupFilesAfterEnv | setupFiles |
verbose | verbose-reporter |
injectGlobals | globals |
moduleNameMapper | resolve.alias |
maxWorkers | pool.maxWorkers |
collectCoverage | coverage.enabled |
coverageDirectory | coverage.reportsDirectory |
coverageProvider | coverage.provider |
coveragePathIgnorePatterns | coverage.exclude |
coverageThreshold | coverage.thresholds |
更多详情,请参考 配置文档。
与 Jest 不同,Rstest 默认不会将测试 API(如 describe、expect、it、test)挂载到全局对象上。
如果你希望继续使用全局测试 API,可以在 rstest.config.ts 文件中启用 globals 选项:
import { defineConfig } from '@rstest/core';
export default defineConfig({
globals: true,
});Rstest 默认使用 swc 进行代码转换,这与 Jest 的 babel-jest 不同。大多数情况下,你不需要做任何更改。你可以通过 tools.swc 配置你的 swc 选项。
export default {
- transform: {
- '^.+\\.(t|j)sx?$': ['@swc/jest', {}],
- },
+ tools: {
+ swc: {}
+ }
}如果你有自定义的 Babel 配置或使用特定的 Babel 插件/预设,你可以添加 Rsbuild Babel 插件:
import { pluginBabel } from '@rsbuild/plugin-babel';
import { defineConfig } from '@rstest/core';
export default defineConfig({
plugins: [pluginBabel()],
});Rstest 提供了与 Jest 兼容的 API。因此,你只需将导入从 Jest 更改为 Rstest:
- import { describe, expect, it, test } from '@jest/globals';
+ import { describe, expect, it, test } from '@rstest/core';Rstest 提供了 rstest API,你可以使用它来访问 Rstest 的工具函数,如 rstest.fn() 和 rstest.mock()。就像 Jest 的 jest.fn() 和 jest.mock() 一样。更多工具函数可以在 Rstest APIs 中找到。
- const fn = jest.fn();
+ const fn = rstest.fn();
fn.mockResolvedValue('foo');Rstest 不支持 done 回调。作为替代,你可以返回一个 Promise 或使用 async/await 进行异步测试。
- test('async test with done', (done) => {
+ test('async test with done', () => new Promise(done => {
// ...
done();
- });
+ }));如果你需要处理错误,你可以按照以下方式修改:
- test('async test with done', (done) => {
+ test('async test with done', () => new Promise((resolve, reject) => {
+ const done = err => (err ? reject(err) : resolve());
// ...
done(error);
- });
+ }));Rstest 中 beforeEach 和 beforeAll 钩子的返回函数用于执行测试后的清理工作。
- beforeEach(() => doSomething());
+ beforeEach(() => { doSomething() });如果你使用 jest.setTimeout() 来设置测试的超时时间,你可以改用 rstest.setConfig()。
- jest.setTimeout(5_000)
+ rstest.setConfig({ testTimeout: 5_000 })