首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在另一个计算属性上调用getter不是测试时的函数

在另一个计算属性上调用getter不是测试时的函数
EN

Stack Overflow用户
提问于 2020-08-22 17:14:38
回答 1查看 463关注 0票数 1

我一直在尝试模拟一个getter函数,但是这个函数也被另一个计算属性调用,并且它作为一个未定义的函数返回。

这是一个breadcrumb组件,它会根据路由路径进行相应的更改。第一个测试正常通过,因为组件不应该呈现。但是第二个测试试图通过使用用户名的getter来获取用户数据。

我对mock getter持怀疑态度。它不是应该返回在beforeEach中定义的模拟对象吗?

提前感谢!

下面是测试规范:

代码语言:javascript
运行
AI代码解释
复制
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('')
  })
})

第一个测试通过,但第二个测试返回:

代码语言:javascript
运行
AI代码解释
复制
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}`,

这是组件的计算函数:

代码语言:javascript
运行
AI代码解释
复制
  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
    }
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-22 17:31:04

我怀疑你需要改变这一点:

代码语言:javascript
运行
AI代码解释
复制
getUserByUsername: (path) => ({

至:

代码语言:javascript
运行
AI代码解释
复制
getUserByUsername: () => (path) => ({

从错误消息和组件代码来判断,getUserByUsername的真实版本似乎返回了一个函数,因此模拟版本也需要这样做。看一看原始的getUserByUsername以确认。

回想一下,getter的外部函数不是您显式调用的函数。当您访问该属性时,它将在后台使用,并作为其第一个参数传递state

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63538979

复制
相关文章
计算属性的setter和getter
        刚才通过计算lastName和firstName获取了整个姓名,当时我们只是通过一直的data对象中属性进行合成的,这个也就是计算属性(computed)的get方法(默认),实质上还有一个set方法,我们来看一下getter和setter;
十月梦想
2018/10/09
1.2K0
vue之计算属性的setter和getter
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <h2>{{fullName}}</h2> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({
兮动人
2021/06/11
8440
vue之计算属性的setter和getter
为什么要用Getter和Setter方法,而不是公开属性
大多数字段的访问都是通过Getter和Setter方法来间接访问,为什么不直接将字段设置为公开属性Public呢?答案在于前者的未来可能性。当我在Java语言编程中开始我的职业生涯时,我就对Getter和Setter感到困惑。为什么要这么写呢?为什么不直接用Public呢?这对我来说是个奇怪的语法。
三哥
2018/12/17
2.2K1
为什么要用Getter和Setter方法,而不是公开属性
在Python中将函数作为另一个函数的参数传入并调用的方法
在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除,以function(*args, **kwargs)进行替代,所以也不应该再使用apply方法
狼啸风云
2019/12/19
10.7K0
js对象属性的getter和setter
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/53996012
空空云
2018/09/27
3.2K0
自动化测试在路上 | 函数及调用
前2篇说到 形象生动的解释什么是Python的类与对象 | 一文带你了解什么是 " 对象的属性 " 今天我们继续趣味学习"函数及调用"
测试小兵
2023/03/09
4900
自动化测试在路上 |  函数及调用
通过getter获取setter函数
放在:https://gitee.com/dromara/stream-query
阿超
2023/06/23
1530
我可以在一个构造函数中调用另一个构造函数么
但在 C++11 版本之前是不可以的,不过你可以通过两种方式来模拟实现(可以参见 the C++ FAQ entry),
ClearSeve
2022/02/10
3K0
java构造函数调用另一个构造函数_java中的构造函数
* 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
用户7886150
2021/04/29
4.6K0
【Kotlin】类的初始化 ① ( 成员属性 | Kotlin 自动为成员字段生成 getter 和 setter 方法 | 手动设置成员的 getter 和 setter 方法 | 计算属性 )
定义 Kotlin 类 , 在 类中 定义成员属性 , 会自动生成 getter 和 setter 方法 ;
韩曙亮
2023/03/30
2.2K0
【Kotlin】类的初始化 ① ( 成员属性 | Kotlin 自动为成员字段生成 getter 和 setter 方法 | 手动设置成员的 getter 和 setter 方法 | 计算属性 )
Groovy 创建索引属性Getter和Setter方法
在Groovy中,我们可以在类中定义属性,并自动在类文件中生成这些属性的getter和setter方法。 如果我们有一个Collection类型属性,我们通常会获得此属性的get/set方法。 但是根据JavaBean规范,我们可以将Collection类型属性定义为索引属性。 这意味着我们需要一个带索引参数的额外get/set方法,因此我们可以直接在属性中设置元素的值:
白石
2019/09/18
2K0
在类中,调用这个类时,用$this->video_model是不是比每次调用这个类时D(‘Video’)效率更高呢…
在类中,调用这个类时,用$this->video_model是不是比每次调用这个类时D(‘Video’)效率更高呢
全栈程序员站长
2022/07/08
5330
在类中,调用这个类时,用$this->video_model是不是比每次调用这个类时D(‘Video’)效率更高呢…
ASTMatcher分析函数调用链(上)
clang是llvm的编译器前端,是一个C语言、C++、Objective-C、Objective-C++语言的轻量级编译器,基本工作是进行词法分析、语法分析,生成抽象语法树(Abstract Syntax Code, AST)。要得到函数之间的调用关系,我们必须分析抽象语法树,clang提供了两种方法:ASTMatchers和RecursiveASTVisitor,RecursiveASTVisitor有两种方式实现,一是clang plugin,二是libtooling
adding
2019/10/18
7.3K0
禁止在构造函数里调用虚函数
在构造函数中调用虚函数会导致程序出现莫名其妙的行为,这主要是对象还没有完全构造完成。下面我们先来看一段代码:
喵叔
2020/09/08
1.7K0
盘点JavaScript中getter()和setter()函数的使用
第一种是 数据属性。已经知道如何使用它们了。到目前为止,使用过的所有属性都是数据属性。
前端进阶者
2021/09/10
1.7K0
盘点JavaScript中getter()和setter()函数的使用
Java-方法重载时 调用未定义的对象属性
public class TestWayReload { int id; String name; String pwd; public TestWayReload(){ System.out.println(“Hellow World!”); System.out.println("################"); }
Fisherman渔夫
2019/07/30
5.7K0
调用函数时,关于传参那些事~
                                                                         
The sky
2023/04/12
1.4K0
调用函数时,关于传参那些事~
在写计算器时学到的
stack模版类的定义需要两个模版参数,一个是元素类型,另一个是容器类型,但只有元素类型是必要的,在不指定容器类型的情况下,默认deque为容器类型
2018/09/03
4550
VC 在调用main函数之前的操作
title: VC 在调用main函数之前的操作 tags: [VC++, 反汇编, C++实现原理] date: 2018-09-16 10:36:23 categories: VC++反汇编分析 keywords: VC++, 反汇编, C++实现原理, main函数调用, VC 运行环境初始化 --- 在C/C++语言中规定,程序是从main函数开始,也就是C/C++语言中以main函数作为程序的入口,但是操作系统是如何加载这个main函数的呢,程序真正的入口是否是main函数呢?本文主要围绕这个主题,通过逆向的方式来探讨这个问题。本文的所有环境都是在xp上的,IDE主要使用IDA 与 VC++ 6.0。为何不选更高版本的编译器,为何不在Windows 7或者更高版本的Windows上实验呢?我觉得主要是VC6更能体现程序的原始行为,想一些更高版本的VS 它可能会做一些优化与检查,从而造成反汇编生成的代码过于复杂不利于学习,当逆向的功力更深之后肯定得去分析新版本VS 生成的代码,至于现在,我的水平不够只能看看VC6 生成的代码 首先通过VC 6编写这么一个简单的程序
Masimaro
2018/10/10
2.2K0
VC 在调用main函数之前的操作
computed计算属性值是函数的监控的数据
computed 页面重新渲染时,不会重复计算,而 watch 会重新计算,所以 computed 性能更高些。
用户7365393
2021/10/06
9630

相似问题

在iOS中调用属性的getter函数时

10

@Id在Getter上而不是在属性上时发生JaVers异常

310

如何在计算属性中调用getter

22

测试调用另一个getter的getter,而不是模仿--或者如何在测试中挂载Vuex?

127

属性getter调用函数不能绑定?

213
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文