使用自定义函数设置一些先决条件和执行顺序



我正在尝试扩展Jest,以便更容易地在不同的API之间进行API集成测试。

我已经遵循了这个教程,我有点工作。这是我的设置:

jest.setup.api.ts

test.apiOne = async (
name: string,
fn?: jest.ProvidesCallback,
timeout?: number
) => {
console.log(`Running test "${name}" against API 1`)
pactum.request.setBaseUrl(`${process.env.API_TEST_HOST}/one`)
test(name, fn, timeout)
}
test.apiTwo = async (
name: string,
fn?: jest.ProvidesCallback,
timeout?: number
) => {
console.log(`Running test "${name}" against API 2`)
pactum.request.setBaseUrl(`${process.env.API_TEST_HOST}/two`)
test(name, fn, timeout)
}

我是这样使用的:

test.apiOne("1", async () => {
console.log("1");
})
test.apiTwo("2", async () => {
console.log("2");
})
test.apiOne("3", async () => {
console.log("3");
})
test.apiOne("4", async () => {
console.log("4");
})

当我运行这些测试时,这是输出

console.log jest.setup.api.ts:26
Running test "1" against API 1
console.log jest.setup.api.ts:38
Running test "2" against API 2
console.log jest.setup.api.ts:26
Running test "3" against API 1
console.log jest.setup.api.ts:38
Running test "4" against API 2
console.log mytest.ts:511
1
console.log jest.setup.api.ts:26
Running test "1" against API 1
console.log jest.setup.api.ts:38
Running test "2" against API 2
console.log jest.setup.api.ts:26
Running test "3" against API 1
console.log jest.setup.api.ts:38
Running test "4" against API 2
console.log mytest.ts:511
2
console.log jest.setup.api.ts:26
Running test "1" against API 1
console.log jest.setup.api.ts:38
Running test "2" against API 2
console.log jest.setup.api.ts:26
Running test "3" against API 1
console.log jest.setup.api.ts:38
Running test "4" against API 2
console.log mytest.ts:511
3
console.log jest.setup.api.ts:26
Running test "1" against API 1
console.log jest.setup.api.ts:38
Running test "2" against API 2
console.log jest.setup.api.ts:26
Running test "3" against API 1
console.log jest.setup.api.ts:38
Running test "4" against API 2
console.log mytest.ts:511
4

因此,对于所有测试,总是为描述中的最后一个测试设置条件。所以测试1应该针对API路径/one运行,但实际上针对/two运行。

有什么办法可以实现我想用杰斯特做的事情吗?

这篇文章在某些方面是错误的。

根据自己的需要修改第三方API不是一个好的做法。如果需要自定义测试助手,则无需修改test。它们可以是可导入的或全局的,并以与test.apiOne相同的方式使用,但潜在问题较少。将这些函数设为async是错误的。测试应该在测试运行开始时就知道了,所以async会产生一个未使用的promise。本文使用await,但键入了一个函数来返回void

test.apiOne不能包含异步操作,当它们发生在test(...)之后时将被丢弃,而当它们发生之前时将导致丢失测试。test(...)结果没有返回,这意味着Jest不会正确处理它返回的promise。

console.log(`Running test "${name}" against API 1`)错误地建议在测试运行时调用它,但实际上是在声明时调用的。

pactum.request.setBaseUrl应该在它应该影响的测试中调用。考虑到测试是异步的,并且使用promise而不是done回调,一个助手是:

global.testApiOne = (name, fn, timeout) => {
test(
name, 
async () => {
console.log(`Running test "${name}" against API 1`)
pactum.request.setBaseUrl(`${process.env.API_TEST_HOST}/one`)
await fn();
},
timeout
)
}

相关内容

最新更新