react测试(5)jest Mock Functions

Mock 函数可以使用来测试代码之间的连接,即用来测试函数被调用的参数,返回值,调用了几次等等

测试函数被调用的参数和返回值

创建一个Mock Functions
        //定义一个调用一定此时回调函数的方法
        function useCallBack(callback, count){
            for (let i = 0; i < count; i++){
                callback(i)
            }
        }
        定义一个Mock Functions
        let callback = jest.fn(x => x*x)
        
        useCallBack(callback, 3)

        //期望callback 被调用3次,每次调用的结果分别为0,1,4
        expect(callback.mock.calls[0][0]).toBe(0);
        expect(callback.mock.calls[1][0]).toBe(1);
        expect(callback.mock.calls[2][0]).toBe(2);
        expect(callback.mock.results[0].value).toBe(0);
        expect(callback.mock.results[1].value).toBe(1);
        expect(callback.mock.results[2].value).toBe(4);

测试值注入到Mock Functions

除次之外还可以将测试值注入到Mock Functions中,以模拟替代某些测试环境中难以调用的方法

        //定义一个调用一定此时回调函数的方法
        let callback = jest.fn();
        
        //在此次测试中为callback注入2个测试值,第一次调用返回"aaa",第二次调用返回"bbb"
        callback.mockReturnValueOnce("aaa").mockReturnValueOnce("bbb")
        
        expect(callback()).toBe("aaa");
        expect(callback()).toBe("bbb");

模拟实现

模拟函数的实现和测试值注入到Mock Functions比较相似

    test("mock function",()=>{
        //mockFn是一个模拟的实现,第一次调用执行() => '1',第二次执行调用() => '2',
        //当实现调用完了后再次调用则执行() =>'0',mockName会为模拟实现提供一个名称
        const mockFn = jest.fn(() => '0')
            .mockImplementationOnce(() => '1')
            .mockImplementationOnce(() => '2').mockName("mockFn");;
        //第一次执行返回“1”,第二次“2”,之后都是“0”,模拟实现的名称为“mockFn”,
        //如果没有mockName("mockFn"),将返回jest.fn
        expect(mockFn()).toBe("1");
        expect(mockFn()).toBe("2");
        expect(mockFn()).toBe("0");
        expect(mockFn.getMockName()).toBe("mockFn");
    })

模拟模块

测试中如果实际调用 API 会使测试缓慢与脆弱,我们可以用 jest.mock(…) 函数模拟 需要的模块,例如axios。

import axios from 'axios';
//模拟模块需要放到test外,不然不会生效
jest.mock('axios');

   test("mock axios",()=>{
        //模拟axios模块
        //当使用axios调用get请求时返回"this is a mock"
        axios.get.mockResolvedValue("this is a mock");
        //假设这就是我们需要测试额函数
        function getMock(){
            return axios.get("mock");
        }
        getMock().then(response => expect(response).toBe("this is a mock"))

    })

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值