是否可以从正在运行的测试中获取当前的规范名称?
基本上我想保存一个文件,例如。使用函数saveFile()
,文件名称为规范名称。无需手动重新输入测试名称。
答案 0 :(得分:6)
这对我有用
console.log(expect.getState().currentTestName);
答案 1 :(得分:5)
我发现唯一可行的方法是使用expect()
,它的this
中包含规范名称。做类似的事情
expect.extend({
async toSaveFile(data) {
fs.writeFileSync(`${this.currentTestName}.txt`, data)
return { pass: true };
},
});
允许然后做
expect().toSaveFile('contents of the file');
这绝对是黑客,但这是我找到规范名称参考的唯一途径。还有this.testPath
表示测试文件
答案 2 :(得分:1)
expect.getState().currentTestName
的问题在于它提供了一个连接字符串。
所以例如如果是 sum.test.js
测试文件:
import { sum } from "./sum";
import { sleep } from "./util/sleep";
describe("testing sum", () => {
describe("middle", () => {
test('adds 1 + 1 to equal 2', async () => {
console.log("TESTNAME", expect.getState().currentTestName)
await sleep(1000)
expect(sum(1, 1)).toBe(2);
});
})
})
它打印出 TESTNAME testing sum middle adds 1 + 1 to equal 2
,其中您无法分辨哪个属于哪个。
要分离每个测试的名称,您可以这样做:
创建自定义环境。这将侦听事件并设置变量:
<块引用>请注意,如果您使用的是 NodeEnvironment
,则可以使用 PuppeteerEnvironment
代替 jest-puppeteer
:
const PuppeteerEnvironment = require("jest-environment-puppeteer")
const NodeEnvironment = require('jest-environment-node');
class CustomEnvironment extends NodeEnvironment {
constructor(config, context) {
super(config, context);
this.testPath = context.testPath;
this.docblockPragmas = context.docblockPragmas;
}
getNames(parent) {
if (!parent) {
return [];
}
if (parent.name === 'ROOT_DESCRIBE_BLOCK') {
return [];
}
const parentName = this.getNames(parent.parent);
return [
...parentName,
parent.name
]
}
async handleTestEvent(event, state) {
const {name} = event;
if (["test_start", "test_fn_start"].includes(name)) {
this.global.testNames = this.getNames(event.test)
}
}
}
module.exports = CustomEnvironment;
在 jest.config.js
中注册文件:
export default {
// ...
// location of the file above
testEnvironment: "./src/my-custom-environment.js",
}
TypeScript
可选)创建 global.d.ts
文件:
declare const testNames: string[]
在您的测试中使用它:
import { sum } from "./sum";
import { sleep } from "./util/sleep";
describe("testing sum", () => {
describe("middle", () => {
test('adds 1 + 1 to equal 2', async () => {
console.log("TEST NAMES", testNames)
await sleep(1000)
expect(sum(1, 1)).toBe(2);
});
})
})
输出:
TEST NAMES [ 'testing sum', 'middle', 'adds 1 + 1 to equal 2' ]
学分归于:
答案 3 :(得分:0)
不确定@Giacomo如何得出结论:这是“唯一可能的方法:),因为this GitHub issue中提到了此替代方法,这使得可以通过jasmine['currentTest'].fullName
在测试中直接访问测试名称,没有{ {1}}。
extend
module.exports = {
setupFilesAfterEnv: ['./jest.setup.js'],
.................
};
// Patch tests to include their own name
jasmine.getEnv().addReporter({
specStarted: result => jasmine.currentTest = result,
specDone: result => jasmine.currentTest = result,
});