jest.fn()的别名?

时间:2020-09-14 11:02:19

标签: javascript typescript unit-testing jestjs coding-style

我有两个用于在Jest中进行模拟的库。这些库具有称为get的相同功能。对于我当前的实现,这是一个问题,因为get被两个不同的库使用,是否可以为模拟函数使用别名(jest.fn())或某种不破坏完整性的解决方法当前实施情况?

这是我当前的实现方式,如果可能的话,我想保持这种方式:

let get: jest.Mock<{}>
jest.mock('rxjs/ajax', () => {
  get = jest.fn()
  return { ajax: { get } }
})

let get as cookieGet: jest.Mock<()> // Can I do something like this 
jest.mock('js-cookie', () => {
  get = jest.fn()
  return { get }
})

我对JS中的别名不太熟悉,或者它们由Jest处理,因此非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

如果对象名称立即使用{ get }速记属性语法,则会导致名称冲突。

另一个问题是,变量必须具有mock前缀才能在jest.mock工厂功能范围内使用。如the documentation所述,

factory参数的局限性在于,由于对jest.mock()的调用被提升到文件的顶部,因此不可能先定义一个变量然后在工厂中使用它。以'mock'开头的变量例外。您有责任保证它们会按时初始化!

可以是:

import ... from 'rxjs/ajax';
import ... from 'js-cookie';

let mockRxAjaxGet: jest.Mock<{}>

jest.mock('rxjs/ajax', () => {
  mockRxAjaxGet = jest.fn()
  return { ajax: { get: mockRxAjaxGet } }
})

let mockJsCookieGet: jest.Mock<()>
jest.mock('js-cookie', () => {
  mockJsCookieGet = jest.fn()
  return { get: mockJsCookieGet }
})

问题在于,一旦jest.mock变量悬挂在导入上方,则let变量位于时间死区且无法分配时,将对其进行评估。

因此,let最好更改为已吊起的var。或照常导入模拟函数,并与get as jest.Mock<...>一起使用,以防间谍。 mocked helper可用于强制执行TypeScript类型安全。