我一直在尝试模拟一个getter函数,但是这个函数也被另一个计算属性调用,并且它作为一个未定义的函数返回。
这是一个breadcrumb组件,它会根据路由路径进行相应的更改。第一个测试正常通过,因为组件不应该呈现。但是第二个测试试图通过使用用户名的getter来获取用户数据。
我对mock getter持怀疑态度。它不是应该返回在beforeEach中定义的模拟对象吗?
提前感谢!
下面是测试规范:
import {
shallowMount,
createLocalVue
} from '@vue/test-utils'
import Breadcrumb from '@/components/Breadcrumb.vue'
import Vuex from 'vuex'
import VueRouter from 'vue-router'
const localVue = createLocalVue()
localVue.use(Vuex)
localVue.use(VueRouter)
const router = new VueRouter()
describe('Breadcrumb.vue', () => {
let store
beforeEach(() => {
store = new Vuex.Store({
getters: {
getUserByUsername: (path) => ({
name: {
first: 'FirstName',
last: 'LastName'
}
})
}
})
})
it('renders home page breadcrumb', () => {
const wrapper = shallowMount(Breadcrumb, { store, router, localVue })
const component = wrapper.find('.breadcrumb')
expect(component.text()).toBe('')
})
it('renders users page breadcrumb', () => {
router.push('/users')
const wrapper = shallowMount(Breadcrumb, { store, router, localVue })
const component = wrapper.find('.breadcrumb')
expect(component.text()).toBe('')
})
})
第一个测试通过,但第二个测试返回:
TypeError: this.getUserByUsername is not a function
41 | crumbs.push(this.users)
42 | for (const path of paths) {
> 43 | const user = this.getUserByUsername(path)
| ^
44 | if (user) {
45 | crumbs.push({
46 | label: `${user.name.first} ${user.name.last}`,
这是组件的计算函数:
computed: {
...mapGetters(['getUserByUsername']),
breadcrumbs () {
const crumbs = []
const routePath = this.$route.path
if (routePath === '/' || routePath === '/404') return []
const paths = routePath.split('/')
delete paths[0]
crumbs.push(this.home)
crumbs.push(this.users)
for (const path of paths) {
const user = this.getUserByUsername(path)
if (user) {
crumbs.push({
label: `${user.name.first} ${user.name.last}`,
path: `/${path}`
})
}
}
return crumbs
}
}
发布于 2020-08-22 17:31:04
我怀疑你需要改变这一点:
getUserByUsername: (path) => ({
至:
getUserByUsername: () => (path) => ({
从错误消息和组件代码来判断,getUserByUsername
的真实版本似乎返回了一个函数,因此模拟版本也需要这样做。看一看原始的getUserByUsername
以确认。
回想一下,getter的外部函数不是您显式调用的函数。当您访问该属性时,它将在后台使用,并作为其第一个参数传递state
。
https://stackoverflow.com/questions/63538979
复制相似问题