Jest单元测试mock函数

在编写单元测试过程中经常遇到需要依赖外部数据的情况,比如异步请求就需要依赖网络,但我们在测试过程中又不允许发起实际请求,这种情况下就需要mock函数替代真实请求结果。

测试中用到mock函数的三种情况

1. 函数的调用捕获

用于测试回调函数时可以捕获函数有没被调用,参数是什么,返回值是什么等。

// 被测试代码
const processProducts = (products, callback) => {
  products.forEach(product => {
    callback(product)
  })
}
// 测试代码
const mockFunc = jest.fn()
processProducts([{...}], mockFunc)
expect(mockFunc.mock.calls.length).toBe(2)
// mockFunc有calls,results等属性

2. 设置函数返回值

可以通过mock函数的mockReturnValue()方法定制返回值,它的参数就是返回值。

  • mockReturnValue():返回直量;
  • mockResolvedValue():返回promise;
// 同1中的processProducts案例,如果此函数有返回值
processProducts = jest.fn()
processProducts.mockReturnValue({name: "dennis"})
// 当测试代码调用processProducts的时候就会返回{name: "dennis"}

3. 改变原函数的实现

jest.fn()是默认的mock函数,如果不想使用默认或者提供函数实现则可以加上参数。

const mockFunc = jest.fn(x => x + 1)

4. mock模块

以上三种实现都是通过jest.fn()mock函数,而jest.mock()则可以mock模块。

  • jest.mock()
  • jest.spyOn()
// 第一种
jest.mock('request');
const request = require('request');
// mock math 对象上的add方法
const addMock = jest.spyOn(math, "add"); 
addMock.mockImplementation(() => "mock"); // 提供一个实现
// 第二种
jest.mock('request', () => {
    return (url, callback) => {
        callback(null, 'ok', {name: 'sam'})
    }
});
const fetchData = require('./func').fetchData;
test('should return data when fetchData request success', () => {
   return fetchData().then(res => {
       expect(res).toEqual({name: 'sam'})
   })
})

5. 钩子函数

  • beforeAll
  • beforeEach
describe('method called', () => {
    beforeEach(() => {
        window.unicode = false;
        window.local = false;
        window.isEnable = false
    })
})
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单元测试概念 为什么要做单元测试 提供描述组件行为的文档 节省手动测试的时间 减少研发新特性时产生的 bug 改进...
    tobbyvic阅读 13,392评论 0 5
  • 1. 环境准备 初始项目 安装jest 下载和配置babel(如果不使用ES6语法,则可以跳过此步骤) 新建一个....
    Linyqs阅读 4,697评论 0 1
  • Mock相关APIJest 中有三个与 Mock函数相关的API,分别是jest.fn()、jest.spyOn(...
    陶某某不爱笑阅读 6,507评论 0 0
  • 彩排完,天已黑
    刘凯书法阅读 9,752评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,831评论 2 7