jest.fn() 的别名?

Aliases for jest.fn()?

我有两个不同的库用于在 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 处理这样的事情,所以非常感谢任何帮助。

如果会导致名称冲突,则无需使用 { get } shorthand 属性 对象字面量语法。

另一个问题是变量需要有mock前缀才能在jest.mock工厂函数的范围内使用。正如 the documentation 所述,

A limitation with the factory parameter is that, since calls to jest.mock() are hoisted to the top of the file, it's not possible to first define a variable and then use it in the factory. An exception is made for variables that start with the word 'mock'. It's up to you to guarantee that they will be initialized on time!

可以是:

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 被提升到 imports 之上,当 let 变量处于临时死区且无法分配时,它将被评估。

所以let最好改成var,吊起来。或者像往常一样导入模拟函数,并在需要间谍的地方与 get as jest.Mock<...> 一起使用。 mocked helper 可用于强制 TypeScript 类型安全。