Jest进阶(五)

SnapShot 快照测试

为什么要用快照?

// demo.js
export const getConfig = () => {
    return {
        server: 'http://www.aaa',
        domain: 'localhost'
    }
}


// demo.test.js
test('测试getConfig ', () => {
    expect(getConfig()).toEqual({
        server: 'http://www.aaa',
        domain: 'localhost'
    })
})

如果像上面这样写,那么每次修改一下配置文件都会要修改测试用例,那么有没有更好的办法呢?快照!

test('测试getConfig ', () => {
    expect(getConfig()).toMatchSnapshot();
})

调用toMatchSnapshot()方法就会生成一个快照文件,当你跟新配置文件再次运行测试用例的时候就会不通过,那么接下里就要根据提示来更新快照,一般就是现在w来查看所有,然后再按u来更新快照。
在这里插入图片描述

在这里插入图片描述

特殊情况:

//demo.js
export const getConfig2 = () => {
    return {
        server: 'http://www.aaa',
        domain: 'localhost',
        date: new Date()
    }
}
test('测试getConfig2 ', () => {
    expect(getConfig2()).toMatchSnapshot();
})

对于上面这种,我们每次都需要从新根据快照,因为配置里的时间本来就是动态的,那么我们需要:

test('测试getConfig2 ', () => {
    expect(getConfig2()).toMatchSnapshot({
        date: expect.any(Date)
    });
})

行内snapshot

npm install prettier

他会把快照放入测试用例里面,如下图:
在这里插入图片描述

3-2 mock深入学习

模拟异步请求时,除了对某个方法通过jest.mock(‘方法名’)来进行模拟外,还可以通过在当前目录下创建一个__mocks__文件夹来放相同名字的文件
在这里插入图片描述
在这里插入图片描述

jest.unmock() 取消mock

当然也可以在jest.config.js 打开automock注释来省略在代码里写jest.mock()

如果想测试一个异步函数,同时测试一个同步函数,那么可以通过const { getNumber }jest.requireActual('./demo')来获取真实的函数

mock timers 对js里的定时器做模拟

// timer.js
export default (callback)=> {
    setTimeout(() => {
       callback(); 
    }, 3000);
}

// timer.test.js
import timer from './timer';
test('测试timer', (done) => {
    timer(()=>{
        expect(2).toBe(1);
        done();
    })
})

上面的写法虽然可以完成对定时器的测试,但是需要等待定时器执行。

那么有什么办法不需要等待定时器呢?

// timer.js
export default (callback) => {
    setTimeout(() => {
        callback();
    }, 30000);
}

// timer.test.js
import timer from './timer';
jest.useFakeTimers();

test('测试timer', () => {
    const fn = jest.fn();
    timer(fn);
    jest.runAllTimers();
    expect(fn).toHaveBeenCalledTimes(1);

})

当定时器被调用多次时:

// timer.js
export default (callback) => {
    setTimeout(() => {
        callback();
        setTimeout(() => {
            callback();
        }, 3000);
    }, 30000);
}

// timer.test.js
import timer from './timer';
jest.useFakeTimers();

test('测试timer', () => {
    const fn = jest.fn();
    timer(fn);
    jest.runAllTimers();  // 老 API 
    // jest.runOnlyPendingTimers(); 只运行处于队列中的timer 老API
	
	// jest.advanceTimersByTime(3000) 让时间快进多长时间  最新API
    expect(fn).toHaveBeenCalledTimes(2);
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

. . . . .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值