我正在寻找一种在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,所以我可能会以错误的方式假设很多东西。如果你看到一些完整的愚蠢,请注意,我很高兴学习! :)
答案 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.
(我今天在寻找一种方法来解决这个问题时碰到了这个问题,只想记录下答案)