在Jest中动态生成测试

时间:2018-01-10 16:21:21

标签: javascript testing code-generation jest

我正在寻找一种在Jest中生成测试并运行它们的方法。我正在测试API,测试用例是从CSV文件导入的,从中生成测试。

目前我所拥有的是一系列参数,我希望从中生成测试并运行它们。这就是我看到它的工作方式:

let testFn =  (testName, request, expected) => it(test.testName, (request, expected) => {
    return new Promise((resolve, reject) => {
        http.post(request, (err, res) => {
            if (err) {
                reject(err);
            } else {
                resolve(res);
            }
        })
    }).then((res) => {
        expect(res.result).toBe(expected['result']);
        return response;
    })
});

上面的代码是我的测试功能。在我看来,应该调用它来执行测试。它根据3个参数生成测试:

  • testName是测试的名称,在控制台中显示
  • request是发送给API的请求
  • expected是预期的结果。

结构始终是相同的:res.result应该是其中的任何内容 参数expect

我从CSV获得测试的数组元素的示例是:

const oneTest = {
    testName: 'the request should return 10',
    request: {
        input: 10
    },
    expected: {
        result: 10
    }
}

这里我们通过tests数组并运行所有测试。这是我无法开展工作的部分。

for (let test in tests) {
    testFn.apply(this, [test.testName, test.request, test.expected])
}

这样做的预期结果是我将从控制台中显示的数组,运行和结果中生成所有测试。

我希望我能解释清楚我的问题是什么,但如果情况并非如此,请不要犹豫(毕竟你是在帮助我!)

PS:这是我第一次使用Jest,所以我可能会以错误的方式假设很多东西。如果你看到一些完整的愚蠢,请注意,我很高兴学习! :)

2 个答案:

答案 0 :(得分:1)

原来Jest中的默认测试运行器是Jasmine 2,它不支持嵌套的it()语句。我的解决方案是切换到Mocha,这样做。

答案 1 :(得分:1)

我认为这不需要摩卡咖啡。也许诀窍是您不必将测试生成函数嵌套在测试中,只需在顶层运行它即可。

这是一个完整的文件,其中包含两个失败的测试和一个通过的测试。

// demo.test.js
const tests = [1, 2, 3];

tests.forEach(value =>
  it(`Expects ${value} to equal 2`, () => expect(value).toEqual(2))
);

及其输出:

Test Suites: 1 failed, 1 total
Tests:       2 failed, 1 passed, 3 total
Snapshots:   0 total
Time:        0.712s
Ran all test suites related to changed files.

(我今天在寻找一种方法来解决这个问题时碰到了这个问题,只想记录下答案)