仅当使用括号调用函数时,Vue 模板中的函数调用测试才会通过

2023-11-22

我将 Vue v2.6 与 Jest (v24.9) 和 Vue-Test-Utils (v1.03) 一起使用。

为了模拟一个方法,我看到了两种不同的语法,

wrapper.vm.updateCart = jest.fn();

and

wrapper.setMethods({ updateCart: jest.fn() });

但第一个没有记录,而第二个已被弃用(请参阅docs).

问题是,使用这两种方法,测试通过的唯一方法是在模板内调用带有括号的方法,这很奇怪,因为我读过的所有文档都以某种方式鼓励使用模板中不带括号的方法。

所以这个测试:

test('Click on .btn calls the right function', () => {
    const wrapper = shallowMount(Modal, {
        propsData: {
            validate: jest.fn(),
        },
    });
    wrapper.setMethods({ updateCart: jest.fn() });
    const $btn = wrapper.find('.btn');
    $btn.trigger('click');
    expect(wrapper.vm.updateCart).toHaveBeenCalled();
});

仅当我用括号调用该方法时才会通过:

<button class="btn" @click="updateCart()">
  {{ dictionary('remove') }}
</button>

但否则会失败(例如使用@click="updateCart").

测试模板中的事件是否正在调用函数的正确语法是什么?

以及为什么文档中出现弃用警告(here and here)定义setMethodapi 作为反模式?

也许只测试模板中的事件触发函数是错误的,因为这种行为应该已经由框架(Vue)保证,而我们应该只专注于测试函数本身?

编辑 07/02/2020

我还尝试了不同的语法:

const spy = jest.spyOn(wrapper.vm, 'updateCart');
const $btn = wrapper.find('.btn');
$btn.trigger('click');
expect(spy).toHaveBeenCalled();

这可以防止覆盖该方法并替换对setMethods,但测试仍然仅在使用括号调用函数时通过。


Both @click="updateCart" and @click="updateCart()"支持语法变体,这很令人困惑,因为 Vue DSL 允许在以下位置提供表达式v-on。前者使用updateCart方法作为事件处理程序,而后者根据组件实例计算表达式,并且不限于方法。

@click="updateCart()"出于一致性原因,更可取,因为表达式通常在 Vue 模板中使用,也@click="notAFunction"默默地失败了@click="notAFunction()"抛出错误。这也允许通过以下方式监视它:

jest.spyOn(wrapper.vm, 'updateCart');

否则,需要在组件实例化之前监视该方法:

jest.spyOn(Modal.methods, 'updateCart');
const wrapper = shallowMount(Modal);

的弃用setMethod已解释:

没有明确的路径来替换 setMethods,因为它确实取决于 根据您之前的使用情况。它很容易导致依赖于的片状测试 实施细节,这是不鼓励的。

...

要存根复杂的方法,请将其从组件中提取出来并在其中进行测试 隔离。要断言调用了方法,请使用测试运行程序 监视它。

对测试实施的担忧是主观的,因为这通常不是一件坏事。提取是否实用取决于具体情况,因为一个函数需要提取到另一个模块才能被监视。

As for updateCart,模拟更新汽车的底层 API 可能就足够了,而不是方法本身。

使用存根方法测试点击事件仍然可能有用,或者至少监视真实的方法。以这种方式测试的是模板,而不仅仅是框架的行为。如果没有间谍,测试失败是否是未知的btn or updateCart.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅当使用括号调用函数时,Vue 模板中的函数调用测试才会通过 的相关文章

随机推荐

  • Visual Studio 2010 Professional 中的 C# 模式

    在配置刚刚安装的 Visual Studio 2010 Professional 时 我错误地选择了 Visual Basic 模式 我想更正我的选择并将其更改为 C 我怎样才能做到这一点 工具 gt 导入和导出设置 gt 重置所有设置 g
  • 词典内部是如何维护的?

    当我说 Dictionary
  • 如何将数据标签添加到seaborn countplot / Factorplot [重复]

    这个问题在这里已经有答案了 我使用 python3 seaborn countplot 我的问题 如何为每个柱添加计数值 显示顶部的标签 每个酒吧 如何让这些条按降序排列 我写了这个 fig plt figure figsize 10 6
  • 在 Perl 中迭代哈希中的哈希数组

    我的哈希中有一个哈希数组 如下所示 VAR1 file gt pathname gt out log size gt 51 name gt out log time gt 1345799296 pathname gt test pl
  • Sublime text3 和 virtualenvs

    我有不同的virtualenv的 用virtualenwrapper 并且我希望能够指定哪个virtualenv与每个项目一起使用 由于我正在使用SublimeREPL用于自定义构建的插件 如何指定使用哪个 python 安装来构建我的项目
  • WebView - 如果不请求两次就无法下载文件?

    如果我听DownloadListener 我得到了我需要请求的URL在浏览器已经请求之后 浏览器已经打开了到该 URL 的连接 这就是它知道这是下载的原因 为什么它不能向我传递该连接 我也尝试分配一个自定义WebViewClient to
  • 在字符串中的特定位置插入字符

    我想在字符串中的特定位置插入额外的字符 或新字符串 例如我想插入d在第四个位置abcefg to get abcdefg 现在我正在使用 old lt abcefg n lt 4 paste substr old 1 n 1 d subst
  • 如何使用 XML 通过 Spring Security Oauth2 启用 /oauth/check_token

    我已经使用 spring security 3 2 和 javaconfig 成功启用了 oauth check token 端点 但目前我仅限于 spring security 3 1 4 然后我坚持使用 XML 配置 oauth tok
  • 如何选取质数来计算哈希码?

    这个问题是根据乔恩 斯基特 Jon Skeet 对这个问题给出的答案而来的 重写 System Object GetHashCode 的最佳算法是什么 为了计算哈希码 使用以下算法 public override int GetHashCo
  • Python 同步 stdout 和 stderr 输出

    使用以下代码 import sys print INFO flush True file sys stdout print ERROR flush True file sys stderr 有时输出是 ERROR INFO 有时 INFO
  • 访问 Roslyn REPL 中的 .config 文件

    使用罗斯林 2012 年 6 月 CTP 有没有办法为 Roslyn C Interactive REPL 提供正在探索的代码的 config 文件 一个简单的示例场景是依赖于通常从 app config web config 获取的连接字
  • glUniformBlockBinding 的用途是什么?

    假设我有一个索引处带有 UniformBlock 的着色器程序0 绑定 UniformBuffer 以下显然足以将 UniformBuffer 绑定到块 glUseProgram program glBindBuffer GL UNIFOR
  • MySQL 异常处理程序正在处理访问异常

    我试图发生错误时回滚 但仍然让客户端接收到错误 这实际上可能是不可能的 除非有一种方法可以访问异常处理程序中的错误 可以从异常中 抛出 即可以发出信号 CREATE PROCEDURE p BEGIN DECLARE EXIT HANDLE
  • 聚集和非聚集索引性能

    我有一个巨大的表 约 1000 万行 在随机的 uniqueidentifier 列上有集群 PK 我对此表执行的最多操作是如果尚不存在具有相同 pk 的行 则插入新行 为了提高它的性能 我使用 IGNORE DUP KEY ON 选项 我
  • 如何在 C# 中消息框关闭后强制按钮、文本框在表单上重新绘制

    我有一个带有按钮 文本框和用户控件的表单 单击按钮时 它会调用另一个类中的方法 在此类中 将打开一个消息框 当用户单击 确定 时 消息框将关闭 类方法将持续 10 秒左右 然后结束 在这 10 秒内 消息框结束后的任何文本框或按钮仍然显示消
  • 将 UIView 图层转换为 UIImage

    我正在视图中使用 AVPlayerLayer 播放视频 我需要将视图转换为图像 我尝试过 myview layer renderInContext context 但这只给出黑色图像 我想将当时的视图转换为带有视频的图像 这个转换会同时发生
  • 代码合同:ccrewrite 退出并显示代码 -1?

    我是代码合同的新手 我下载了最新版本的代码合约项目 1 4 40314 1 并开始在我的项目中实现它 当我通过 VS2010 中的 代码合同 选项卡启用 运行检查 时 出现此错误 Error 1 The command C Program
  • 想要在使用 WshShell.Exec 方法中隐藏命令提示符窗口

    我想从 javascript 执行 java 程序并希望获得输出 我详细地尝试了以下代码 WshShell new ActiveXObject WScript Shell var launch cmd exe c java classpat
  • 使用 string.gsub 替换字符串,但只能替换整个单词

    我有一个搜索替换脚本 可以用来替换字符串 它已经具有执行不区分大小写的搜索和 转义 匹配的选项 例如允许在搜索中搜索 等 然而现在我被要求仅匹配整个单词 我尝试在每个末尾添加 s 但这与字符串末尾的单词不匹配 然后我无法弄清楚如何捕获白色
  • 仅当使用括号调用函数时,Vue 模板中的函数调用测试才会通过

    我将 Vue v2 6 与 Jest v24 9 和 Vue Test Utils v1 03 一起使用 为了模拟一个方法 我看到了两种不同的语法 wrapper vm updateCart jest fn and wrapper setM