我在jest中模拟静态方法时遇到了麻烦。假设你有一个带有静态方法的类A:
export default class A {
f() {
return 'a.f()'
}
static staticF () {
return 'A.staticF()'
}
}
还有一个B类,它导入了A
import A from './a'
export default class B {
g() {
const a = new A()
return a.f()
}
gCallsStaticF() {
return A.staticF()
}
}
现在您想要模拟 A。模拟 f() 很容易:
import A from '../src/a'
import B from '../src/b'
jest.mock('../src/a', () => {
return jest.fn().mockImplementation(() => {
return { f: () => { return 'mockedA.f()'} }
})
})
describe('Wallet', () => {
it('should work', () => {
const b = new B()
const result = b.g()
console.log(result) // prints 'mockedA.f()'
})
})
但是,我找不到任何关于如何模拟 A.staticF 的文档。这是否可能?
expect(mockStaticF).toBeCalled()
类型的断言,尽管绑定版本不起作用(例如expect(A.staticF).toBeCalled()
会抛出异常) - David AmockStaticF
分配给A.staticF
吗?例如:A.staticF = mockStaticF
。 - Todd Drinkwaterjest.mock('../src/a', () => { const A = jest.fn().mockImplementation(() => { f: () => { return 'mockedA.f()'} } }); A.staticF = jest.fn(); return A; })
- frankconst mockStaticF = jest.fn(A.staticF).mockImplementationOnce(...); A.staticF = mockStaticF;
- sKopheKA.staticF = mockStaticF
这样的分配方法来模拟方法,否则会阻止Jest在必要时还原方法并潜在地导致测试交叉污染,这就是jest.spyOn的用途。jest.mock('../src/a')
会自动进行模拟,它已经将静态方法作为存根,从而允许A.staticF.mockReturnValue('worked')
。 - Estus Flask