wrapper.vm.$nextTick(() = > {
expect(spy).toBeCalled();
done()
})
});
在测试第二个情况时,由于对inputValue赋值时spy会被执行一次,所以需要清除spy的状态,这样才能得出正确的预期:
it('is not called with same value', (done) = > {
wrapper.vm.inputValue = 'ok';
wrapper.vm.$nextTick(() = > {
// 清除已发生的状态
spy.mockClear();
wrapper.vm.inputValue = 'ok';
wrapper.vm.$nextTick(() = > {
expect(spy).not.toBeCalled();
done()
})
})
});
测试方法
单元测试的核心之一就是测试方法的行为是否符合预期,在测试时要避免一切的依赖,将所有的依赖都mock掉。
创建Test3组件,输入问题后,点击按钮后,使用axios发送HTTP请求,获取答案
<template>
<div class="wrapper">
<label for="input">问题:</label>
<input id="input" type="text" v-model="inputValue">
<button @click="getAnswer">click</button>
<p>答案:{{answer}}</p>
<img :src="src">
</div>
</template><script>
import axios from 'axios';
export default {
name: 'Test3',
data() {
return {
inputValue: 'ok?',
answer: '',
src: ''
}
},
methods: {
getAnswer() {
const URL = 'https://yesno.wtf/api';
return axios.get(URL).then(result => {
if (result && result.data) {
this.answer = result.data.answer;
this.src = result.data.image;
return result
}
}).catch(e => {})
}
}
}
</script>
<style scoped>
.wrapper {
width: 500px;
margin: 0 auto;
text-align: left;
}
</style>
这个例子里面,我们仅仅关注测试getAnswer方法,其他的忽略掉。为了测试这个方法,我们需要做的有:
我们不需要实际调用axios.get方法,需要将它mock掉
我们需要测试是否调用了axios方法(但是并不实际触发)并且返回了一个Promise对象
返回的Promise对象执行了回调函数,设置用户名和头像
我们现在要做的就是mock掉外部依赖。Jest提供了一个很好的mock系统,让我们能够很轻易的mock所有依赖,前面我们用过jest.spyOn方法和jest.fn方法,但对于上面的例子来说,仅使用这两个方法是不够的。
我们现在要mock掉整个axios模块,使用的方法是jest.mock,就可以mock掉依赖的模块。
jest.mock('dependency-path', implementationFunction)在Test3.spec.js中,首先将axios中的get方法替换为我们的mock函数,然后引入相应的模块










