【问题标题】:Aliases for jest.fn()?jest.fn() 的别名?
【发布时间】:2020-09-14 11:02:19
【问题描述】:

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

【问题讨论】:

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


    【解决方案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&lt;...&gt; 一起使用,其中预计会有间谍。 mocked helper 可用于强制 TypeScript 类型安全。

    【讨论】:

      猜你喜欢
      • 2020-11-02
      • 2021-11-14
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2021-11-18
      • 2017-12-24
      • 2020-06-09
      相关资源
      最近更新 更多