我正在尝试扩展Jest,以便更容易地在不同的API之间进行API集成测试。
我关注了this tutorial,我让它在某种程度上起到了作用。下面是我的设置:
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因此,对于所有测试,总是为describe中的最后一个测试设置条件。因此,测试1应该针对API path /one运行,但实际上是针对/two运行的。
有没有办法实现我正在尝试用Jest做的事情?
发布于 2021-05-19 16:17:22
这篇文章在某些方面是错误的。
根据自己的需要修改第三方API不是一种好的做法。如果需要自定义测试帮助器,则无需修改test。它们可以是可导入的,也可以是全局的,使用方式与test.apiOne相同,但潜在问题较少。将这些函数设置为async是错误的。在测试运行开始时,测试应该是已知的,因此async会产生一个未使用的promise。本文使用await,但键入一个函数来返回void。
test.apiOne不能包含异步操作,当它们发生在test(...)之后时,它们将被丢弃,并且当它们之前发生时,它们将导致丢失测试。test(...)结果没有返回,这意味着它返回的promise将不会被Jest正确处理。
console.log(`Running test "${name}" against API 1`)错误地建议在测试运行时调用它,但实际上它是在声明时调用的。
pactum.request.setBaseUrl应该在它应该影响的测试中调用。考虑到测试是异步的,并且使用promises而不是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
)
}https://stackoverflow.com/questions/67598946
复制相似问题