jest mock storage

同一个文件中的tests是串行执行的
用toHaveBeenCalledTimes断言调用构造函数的次数
//hookSaga.js
...
const userStorage = new UserStorage()
export function* loginHookSaga() {}
export function* logoutHookSaga() {}
export function* restoreHookSaga() {}
...
//hookSaga.test.js
import UserStorage from 'src/util/UserStorage'
jest.mock('src/util/UserStorage')
//这里mock了userSaga是为了避免hookSaga里面import真正地userSaga的时候,会再次创建UserStorage
jest.mock('src/redux/sagas/userSaga')

describe("test", () => {
	afterEach(() => {
	//这里会直接把之前new的UserStorage清理掉,并且下一个test case里require时也不会重新new一个。
		UserStorage.mockClear()
	})
	test("test1", () => {
		const {loginHookSaga} = require('./hookSaga')
		//调用UserStorage构造方法的次数
		expect(UserStorage).toHaveBeenCalledTimes(1)
	})
	test("test2", () => {
		const {logoutHookSaga} = require('./hookSaga')
		expect(UserStorage).toHaveBeenCalledTimes(1)
	})
	test("test3", () => {
		const {restoreHookSaga} = require('./hookSaga')
		expect(UserStorage).toHaveBeenCalledTimes(1)
	})
})

使用require只会把其中的 new UserStorage() 执行一遍。所以这三个测试只有test1能通过,因为afterEach执行了Clear all instances and calls to constructor and all methods。
如果需要test2、test3能通过,需要手动new const userStorage = new UserStorage()

如何mock storage.loadInfo的返回值

有很多地方会用到如const userName = yield call(userStorage.loadInfo, 'name')操作。此时就需要mock一下userStorage.loadInfo方法的返回值。有以下思路:

  1. 首先要成功mock一个UserStorage. jest.mock('src/util/UserStorage')
  2. 然后在test case中获取UserStorage的实例const userStorage = UserStorage.mock.instances[0]
  3. 然后mock该实例userStorage的方法的返回值,如
	  const userStorage = UserStorage.mock.instances[0]
      userStorage.loadUserInfo = jest.fn().mockImplementation(() => loginCache)
      userStorage.loadInfo = jest
        .fn()
        .mockImplementationOnce(() => userId)
        .mockImplementationOnce(() => userName)
        .mockImplementationOnce(() => institution)
        .mockImplementationOnce(() => location)
        .mockImplementationOnce(() => company)

Ref:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值