如何获得当前的规格名称

时间:2018-10-13 00:04:34

标签: jestjs

是否可以从正在运行的测试中获取当前的规范名称?

基本上我想保存一个文件,例如。使用函数saveFile(),文件名称为规范名称。无需手动重新输入测试名称。

4 个答案:

答案 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,其中您无法分辨哪个属于哪个。

解决方案

要分离每个测试的名称,您可以这样做:

步骤 1

创建自定义环境。这将侦听事件并设置变量:

<块引用>

请注意,如果您使用的是 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;

步骤 2

jest.config.js 中注册文件:


export default {

    // ...

    // location of the file above
    testEnvironment: "./src/my-custom-environment.js",

}

第 3 步(TypeScript 可选)

创建 global.d.ts 文件:

declare const testNames: string[]

步骤 4

在您的测试中使用它:

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}}。

jest.config.js:

extend

jest.setup.js:

module.exports = {
    setupFilesAfterEnv: ['./jest.setup.js'],
    
    .................
};

然后,在您的* .test.js文件中...

// Patch tests to include their own name
jasmine.getEnv().addReporter({
    specStarted: result => jasmine.currentTest = result,
    specDone: result => jasmine.currentTest = result,
});