首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jest带有设置一些前置条件和执行顺序的自定义函数

Jest带有设置一些前置条件和执行顺序的自定义函数
EN

Stack Overflow用户
提问于 2021-05-19 15:43:52
回答 1查看 25关注 0票数 1

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

我关注了this tutorial,我让它在某种程度上起到了作用。下面是我的设置:

jest.setup.api.ts

代码语言:javascript
复制
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)
}

我这样使用它:

代码语言:javascript
复制
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");
})

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

代码语言:javascript
复制
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做的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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回调,因此帮助器是:

代码语言:javascript
复制
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
  )
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67598946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档