在ts-jest中还原导入的类函数的模拟

问题描述 投票:0回答:1

问题

我在嘲笑一个从另一个类(在主类内部被调用)导入的函数(仅一个)。我能够模拟该函数并返回我提供的值。但是我无法在以后的测试中将模拟的功能恢复到正常状态。

任何帮助将不胜感激!

框架使用:玩笑+ ts-jest

代码

〜main.ts

import {SubClass} from './subclass.ts'
export class MainClass {
 let sub: SubClass = new SubClass()

public async Car(){
  let start = await sub.key();
  return start
}

}

〜sub.ts

export class SubClass{ 

public async key(){
  return "you can start the car"
}
}

main.test.ts

import {SubClass} from './subclass.ts'
import {MainClass} from './mainclass.ts'
import {mocked} from 'ts-jest/utils'

jest.mock(./subclass.ts)

let main = new MainClass()
let sub = new SubClass()
let mockedFn = mocked(sub,true)

mockedFn.key = jest.fn().mockImplementation(() => console.log('mocking succesfull'))

afterEach(()=>{
mockedFn.key.mockRestore() // tried mockClear(), mockReset()
}

it('test for main func mocked result',async ()=>{
 const result = await main.car()
 expect(result).toEqual("mocking succesfull")

}
it('test for main func result',async ()=>{
 const result = await main.car()
 expect(result).toEqual("you can start the car") // getting result as undefined
}


typescript unit-testing jestjs jest ts-jest
1个回答
0
投票

原始mockedFn.key方法在重新分配后会丢失,无法通过Jest还原它:

mockedFn.key = jest.fn()

应该是:

jest.spyOn(mockedFn, 'key').mockImplementation(...)

如果应该还原方法或属性,则永远不要通过直接分配jest.fn()来对其进行监视/模拟。这尤其适用于可以交叉污染测试的模拟全局变量。

© www.soinside.com 2019 - 2024. All rights reserved.