详解Jest结合Vue-test-utils使用的初步实践

2020-06-14 06:26:38易采站长站整理

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函数,然后引入相应的模块