【发布时间】:2019-09-05 15:00:20
【问题描述】:
我有两个指令应该向组件添加数据属性以进行测试,但是实际上只有一个指令被添加。这两个组件是 Bootstrap-Vue 的 BFormInput 和 BButton。
我尝试删除除一个按钮之外的所有内容,但仍未添加该指令,即
<b-input-group class="sm-2 mb-2 mt-2">
<b-button
variant="primary"
@click="searchJobs"
class="rounded-0"
v-jobs-search-button-directive="{ id: 'search-button' }"
>
Search
</b-button>
</b-input-group>
wrapper.html() 输出为:
<b-input-group-stub tag="div" class="sm-2 mb-2 mt-2"><b-button-stub target="_self" event="click" routertag="a" variant="secondary" type="button" tag="button" class="rounded-0">
Search
</b-button-stub></b-input-group-stub>
但是,当我将输入表单保留在原位时,它会被添加,而不是按钮,即
<b-input-group class="sm-2 mb-2 mt-2">
<b-form-input
v-jobs-search-input-directive="{ id: 'input-keyword' }"
class="mr-2 rounded-0"
placeholder="Enter Search term..."
:value="this.searchConfig.Keyword"
@input="this.updateJobsSearchConfig"
/>
</b-input-group>
wrapper.html() 输出为:
<b-input-group-stub tag="div" class="sm-2 mb-2 mt-2"><b-form-input-stub value="" placeholder="Enter Search term..." type="text" class="mr-2 rounded-0" data-jobs-search-input-id="input-keyword"></b-form-input>
这就是我添加指令的方式
<template>
<b-input-group class="sm-2 mb-2 mt-2">
<b-form-input
v-jobs-search-input-directive="{ id: 'input-keyword' }"
class="mr-2 rounded-0"
placeholder="Enter Search term..."
:value="this.searchConfig.Keyword"
@input="this.updateJobsSearchConfig"
/>
<b-button
variant="primary"
@click="searchJobs"
class="rounded-0"
v-jobs-search-button-directive="{ id: 'search-button' }"
>
Search
</b-button>
</b-input-group>
</template>
<script>
import { mapActions, mapState } from 'vuex'
import JobService from '@/api-services/job.service'
import JobsSearchInputDirective from '@/directives/components/jobs/JobsSearchInputDirective'
import JobsSearchButtonDirective from '@/directives/components/jobs/JobsSearchButtonDirective'
export default {
name: 'jobs-search',
directives: { JobsSearchInputDirective, JobsSearchButtonDirective },
data () {
return {
jobs: [],
pages: 0
}
},
computed: {
...mapState({
pagedConfig: state => state.jobs.paged,
searchConfig: state => state.jobs.search
})
},
methods: {
// Methods go here
}
}
jobs-search-input-directive 是
export default (el, binding) => {
if (process.env.NODE_ENV === 'test') {
Object.keys(binding.value).forEach(value => {
el.setAttribute(`data-jobs-search-input-${value}`, binding.value[value])
})
}
}
jobs-search-button-directive 是
export default (el, binding) => {
if (process.env.NODE_ENV === 'test') {
Object.keys(binding.value).forEach(value => {
el.setAttribute(`data-jobs-search-button-${value}`, binding.value[value])
})
}
}
这是我运行的测试,使用shallowMount安装
it('should call jobsSearch method on search button click event', () => {
wrapper.find('[data-jobs-search-button-id="search-button"]').trigger('click')
expect(searchJobs).toHaveBeenCalled()
})
与
一起返回Error: [vue-test-utils]: find did not return [data-jobs-search-button-id="search-button"], cannot call trigger() on empty Wrapper
但是wrapper.find('[data-jobs-search-input-id="input-keyword"]') 确实找到了输入表单
这两个指令在JobsSearch.vue 组件中注册,如果我删除process.env 部分,它们肯定会被渲染
我希望将属性添加到两个组件中,但它只会在测试时添加到 BFormInput。任何帮助将不胜感激。
【问题讨论】:
-
什么是
v-jobs-search-button-directive?那是你写的吗?我们可以看到它的代码吗?您确定正确地注册了该指令吗?控制台中的任何错误?该指令是在应用程序本身中失败还是仅在运行测试时失败? -
@skirtle 我已经添加了上面指令的代码。它们在指令内的组件上注册:{...}。它们不会在应用程序本身失败,而只会在运行测试时失败。更具体地说,只有 ``` v-jobs-search-input-directive``` 被添加用于测试,而
v-jobs-search-button-directive没有
标签: vue.js vue-test-utils