Jest: spyOn监听某个方法期间,其他的test也调用该监听方法导致测试失败

待测试方法

const sum={
    a(callback){
        setTimeout(()=>{
            this.k();
            callback();
        },200);
    },
    k(){
        console.log(44)
    }
}

export default sum

我想测试a方法,测试思路:在a回调函数中判断k方法被调用的次数

测试代码

//测试1
test('100ms后调用k',()=>{
    setTimeout(()=>{
        sum.k();
    },100)
})

//测试2
test('a():测试k被调用测试',(done)=>{
    let k=jest.spyOn(sum,'k');
    sum.a(()=>{
        expect(k).toBeCalledTimes(1)
        done();
    })
})

运行结果

clipboard.png

问题

  1. 那么是否结果证明测试2在监控k方法期间,如果其他测试也调用了k,也会被记录,所以被调用了2次,导致测试不通过?
  2. 但是如果我把测试1测试2调换顺序又是ok的,为啥?
  3. 有没有方法能让测试1测试2以同步的方式执行?这样就不会存在问题了

多谢大咖~

阅读 6k
1 个回答

1、根据代码执行过程,监听是最开始执行的,随后是100ms的测试1,之后就是测试2里面调用a 200ms的sum.k(), 所以回调后toBeCalledTimes应该是等于2
2、为什么会这样不知道,是否因为settimeout的时间不够长
3、我觉得可以用async await去等待异步,对promise是有效的,但是对settimeout是否有效待测试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题