Jest中的mock

Jest中mock的作用:

  • mock函數,捕獲函數的調用 和 返回結果 以及 this指向 和 調用順序.
  • 可以讓我們自由的設置返回結果.
  • 改變內部函數的實現.

業務代碼

import axios from 'axios'

export const runCallback = (callback) => {
	callback()
}

export const getData = () => {
  return axios.get('/api').then(res => res.data)
}

1.捕獲函數的調用 和 返回結果 以及 this指向 和 調用順序

測試代碼:

import { runCallback, getData } from './demo'

test.only('測試 runCallback', () => {
  const func = jest.fn() //1. mock函數,捕獲函數的調用 和 返回結果 以及 this指向 和 調用順序
  // 改變this指向
  // func.mockImplementation(() => {
  //   return this
  // })

  func.mockReturnThis() // 等價於上邊的mockImplementation

  runCallback(func) 
  runCallback(func)
  runCallback(func)
  expect(func.mock.calls.length).toBe(3) // 斷言:斷定什麼樣的內容會有什麼樣的結果
  // expect(func).toBeCalled() // 匹配函數func是否被執行
  console.log(func.mock)
})
  • jest.fn() 可捕獲函數的調用 和 返回結果 以及 this指向 和 調用順序.

2.可以讓我們自由的設置返回結果

import { runCallback, getData } from './demo'

test.only('測試 runCallback', () => {
  const func = jest.fn() 
  // 2.可以讓我們自由的設置返回結果
  func.mockReturnValueOnce('riona-cheng') // 函數執行第一次時,模擬返回結果爲'riona-cheng'
  func.mockReturnValueOnce('aaa') // 函數執行第二次時,模擬返回結果爲'aaa'
  func.mockReturnValueOnce('bbb') // 函數執行第三次時,模擬返回結果爲'bbb'

  runCallback(func) 
  runCallback(func)
  runCallback(func)
  expect(func.mock.calls.length).toBe(3) // 斷言:斷定什麼樣的內容會有什麼樣的結果
  // expect(func.mock.results[0].value).toBeUndefined()
  // expect(func).toBeCalled() // 匹配函數func是否被執行
  console.log(func.mock)
})

測試結果:返回值爲我們分別設置的值

3.改變內部函數的實現

mock測試異步axios請求:

import { runCallback, getData } from './demo'
import axios from 'axios'
jest.mock('axios') // 讓jest對axios做一個模擬

/** 
 * 
 { calls: [ [], [] ], // 被調用了多少次 以及 傳入參數
      instances: [ undefined, undefined ], // 每次func運行時,this的指向
      invocationCallOrder: [ 1, 2 ], // 執行順序
      results: // 每次函數執行的返回結果
       [ { type: 'return', value: undefined },
         { type: 'return', value: undefined } ] }
 *  */ 

// 對前端測試,只需要測試請求發送了即可,至於具體返回什麼,是後端負責測試的
// 3.改變函數的內部實現,之前是異步發請求,現在是同步的模擬數據
test('測試 getData', async () => {
  // axios.get.mockResolvedValue({data: 'hello'})
  // await getData().then(res => {
  //   expect(res).toBe('hello')
  // })

  // 模擬多次請求返回不同結果
  axios.get.mockResolvedValueOnce({data: 'hello'})
  axios.get.mockResolvedValueOnce({data: 'world'})
  await getData().then(res => {
    expect(res).toBe('hello')
  })

  await getData().then(res => {
    expect(res).toBe('world')
  })
})
  • jest.mock(‘axios’) 讓jest對axios做一個模擬. 在測試用例中即可用同步代碼模擬數據,不需要發送真實的請求。

知識補充

  • test.only : 只執行當前的測試用例代碼.
  • expect().toBe() 這種語句被稱爲斷言:斷定什麼樣的內容會有什麼樣的結果.
  • mock函數的mock屬性:
/** 
 { calls: [ [], [] ], // 被調用了多少次 以及 傳入參數
      instances: [ undefined, undefined ], // 每次func運行時,this的指向
      invocationCallOrder: [ 1, 2 ], // 執行順序
      results: // 每次函數執行的返回結果
       [ { type: 'return', value: undefined },
         { type: 'return', value: undefined } ] }
 **/ 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章