测试功能组件内点击事件的 function/method 调用
Testing for a function/method call on click event inside a functional component
在碰壁几天后,我了解到使用 vue-test-utils 测试功能组件会导致一些问题
总而言之,我正在使用 Bootstrap-Vue 的 B-Button
,上面有一个 @click
事件,它调用了一些 function/method。当我尝试 运行 测试以了解该方法是否被调用时,测试失败。但是,当我将功能 B-Button
与 <button>
交换时,测试通过了。
这里是JobSearch.vue
组件
<template>
<b-input-group>
<b-form-input
class="mr-2 rounded-0"
placeholder="Enter Search term..."
id="input-keyword"
/>
<!-- <b-button-->
<!-- @click="searchJobs"-->
<!-- class="rounded-0 ml-2"-->
<!-- variant="primary"-->
<!-- id="reset-button"-->
<!-- >-->
<!-- Reset-->
<!-- </b-button>-->
<button
@click="resetFilter"
class="rounded-0 ml-2"
id="reset-button">
Reset
</button>
</b-input-group>
</template>
<script>
export default {
name: 'job-search-test',
methods: {
async searchJobs () {
console.log('Calling Search Jobs from JobsSearchTest')
},
resetFilter () {
console.log('Clicked On Reset')
}
},
mounted () {
// this.searchJobs()
}
}
</script>
这里是JobSearch.spec.js
import { shallowMount, createLocalVue } from '@vue/test-utils'
import BootstrapVue from 'bootstrap-vue'
import JobSearchTest from '@/components/jobs/JobSearchTest'
const localVue = createLocalVue()
localVue.use(BootstrapVue)
describe('JobsSearchTest.vue', () => {
it('should call searchJobs method when component is mounted', () => {
let searchJobs = jest.fn()
shallowMount(JobSearchTest, {
methods: {
searchJobs
},
localVue })
expect(searchJobs).toHaveBeenCalledTimes(1)
})
it('should call resetFilter method on reset button click event', () => {
let resetFilter = jest.fn()
const wrapper = shallowMount(JobSearchTest, {
methods: {
resetFilter
},
localVue
})
expect(resetFilter).not.toHaveBeenCalled()
wrapper.find('#reset-button').trigger('click')
console.log(wrapper.find('#reset-button'))
expect(resetFilter).toHaveBeenCalled()
})
})
通过注释掉 <b-button>
部分并注释掉 <button>
测试失败了,但是,如果它能通过,那就太好了,因为对于这个项目,我们想使用 Bootstrap 看。
任何解决方法的想法,这不会带走测试的价值?例如,根据我之前提出的一个问题,功能组件不能很好地与指令一起运行,因此通过使用非功能性存根指令可以正常工作,但是,这会带走测试的价值。
据我所知,对此有两个答案。
使用 shallowMount
时,功能组件应在创建包装器时存根。
另一个解决方案是使用 mount
。只有当组件被隔离测试时,浅安装才是真正好的。我在这里测试 children... 因为 b-button 是一个 child 组件...我需要把它带进来
在碰壁几天后,我了解到使用 vue-test-utils 测试功能组件会导致一些问题
总而言之,我正在使用 Bootstrap-Vue 的 B-Button
,上面有一个 @click
事件,它调用了一些 function/method。当我尝试 运行 测试以了解该方法是否被调用时,测试失败。但是,当我将功能 B-Button
与 <button>
交换时,测试通过了。
这里是JobSearch.vue
组件
<template>
<b-input-group>
<b-form-input
class="mr-2 rounded-0"
placeholder="Enter Search term..."
id="input-keyword"
/>
<!-- <b-button-->
<!-- @click="searchJobs"-->
<!-- class="rounded-0 ml-2"-->
<!-- variant="primary"-->
<!-- id="reset-button"-->
<!-- >-->
<!-- Reset-->
<!-- </b-button>-->
<button
@click="resetFilter"
class="rounded-0 ml-2"
id="reset-button">
Reset
</button>
</b-input-group>
</template>
<script>
export default {
name: 'job-search-test',
methods: {
async searchJobs () {
console.log('Calling Search Jobs from JobsSearchTest')
},
resetFilter () {
console.log('Clicked On Reset')
}
},
mounted () {
// this.searchJobs()
}
}
</script>
这里是JobSearch.spec.js
import { shallowMount, createLocalVue } from '@vue/test-utils'
import BootstrapVue from 'bootstrap-vue'
import JobSearchTest from '@/components/jobs/JobSearchTest'
const localVue = createLocalVue()
localVue.use(BootstrapVue)
describe('JobsSearchTest.vue', () => {
it('should call searchJobs method when component is mounted', () => {
let searchJobs = jest.fn()
shallowMount(JobSearchTest, {
methods: {
searchJobs
},
localVue })
expect(searchJobs).toHaveBeenCalledTimes(1)
})
it('should call resetFilter method on reset button click event', () => {
let resetFilter = jest.fn()
const wrapper = shallowMount(JobSearchTest, {
methods: {
resetFilter
},
localVue
})
expect(resetFilter).not.toHaveBeenCalled()
wrapper.find('#reset-button').trigger('click')
console.log(wrapper.find('#reset-button'))
expect(resetFilter).toHaveBeenCalled()
})
})
通过注释掉 <b-button>
部分并注释掉 <button>
测试失败了,但是,如果它能通过,那就太好了,因为对于这个项目,我们想使用 Bootstrap 看。
任何解决方法的想法,这不会带走测试的价值?例如,根据我之前提出的一个问题,功能组件不能很好地与指令一起运行,因此通过使用非功能性存根指令可以正常工作,但是,这会带走测试的价值。
据我所知,对此有两个答案。
使用 shallowMount
时,功能组件应在创建包装器时存根。
另一个解决方案是使用 mount
。只有当组件被隔离测试时,浅安装才是真正好的。我在这里测试 children... 因为 b-button 是一个 child 组件...我需要把它带进来