我有两个用于在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处理,因此非常感谢任何帮助。
答案 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类型安全。