我正在尝试扩展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
)
}