Angular2测试表单:未调用提交方法

2024-04-22

有了这个组件

import {Component} from 'angular2/core';
import { FORM_DIRECTIVES } from 'angular2/common';

@Component({
    selector: 'something',
    templateUrl: 'something.html',
    providers: [],
    directives: [FORM_DIRECTIVES],
    pipes: []
})
export class Something {

    constructor() { }

    save(data) {
        alert(data);
    }
}

使用此模板(something.html)

<form #myForm="ngForm" (ngSubmit)="save(myForm.value)">
    <label for="title">Title</label>
    <input id="title" type="text" ngControl="title" />

    <label for="primaryImage">Primary Image</label>
    <input id="primaryImage" type="text" ngControl="primaryImage" />

    <button type="submit">Save</button>
</form>

和这个测试

it('should call save method after clicking a Save button', injectAsync([TestComponentBuilder], (tcb: TestComponentBuilder) => {
    return tcb.createAsync(Something).then((fixture) => {
        spyOn(fixture.componentInstance, 'save');
        fixture.detectChanges();
        const compiled = fixture.nativeElement;
        compiled.querySelector('#title').value = 'testTitle';
        compiled.querySelector('#primaryImage').value = 'tabc.png';                   
        compiled.querySelector('button').click();
        expect(fixture.componentInstance.save).toHaveBeenCalledWith({
            title: 'testTitle',
            primaryImage: 'abc.png'
        });
    });
}));

测试失败,尚未在间谍上调用保存方法。 但是,当我在浏览器中手动尝试它时,如果有效,则会显示警报。 当我执行 form.submit 而不是 button.click 时,测试也会失败。

当我使用(click)="save(myForm.value)"在按钮上而不是ngSubmit在表单上,​​测试仍然失败,但原因不同。在这种情况下,已调用间谍上的 Save 方法,但传递给它的数据是{}.

谁能告诉我我在这里缺少什么?


要添加到Juanmi的答案以使测试完全完成,必须通过单击按钮来触发事件,因为例如,如果按钮移出标签,应用程序将失败,但测试仍然会通过。

我已经通过调用本机元素(而不是调试元素)的“click()”方法设法解决了上述问题。请参阅下面的代码。请注意,在下面的代码中,我使用的是 ReactiveForms 语法,但它不会对测试产生影响。

<form [formGroup]="sampleForm" (submit)="submit($event)">
    <input id="sampleBtn" type="submit" class="btn-default btn btn-primary" value="Click Me">
</form>

在我的 spec.ts 文件中

spyOn(fixture.componentInstance, 'submit');
let loginBtn: DebugElement = fixture.debugElement.query(By.css('#sampleBtn'));
loginBtn.nativeElement.click();
fixture.detectChanges();
expect(fixture.componentInstance.submit).toHaveBeenCalled();

按钮上的 click() 反过来会触发(提交)处理函数。希望这可以帮助。 :)

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

Angular2测试表单:未调用提交方法 的相关文章

随机推荐

  • Yii2如何检查两个模型是否已经链接

    我有两个通过连接表关联的模型 model gt link 是用于建立两个模型之间关系的方法 它基本上用两个模型的相应键填充连接表 如果两个模型已链接并且我尝试再次链接它们 则会出现错误 因为密钥对已存在于连接表中 然后我需要在尝试链接模型之
  • 将工作簿的所有工作表复制到另一个文件

    我想对我的所有 xlsx 执行以下步骤 复印第一张纸 将复制的工作表粘贴到另一个文件 将粘贴的工作表重命名为文件名 重复步骤 1 并将工作表复制到步骤 2 的同一文件中 重复步骤 3 我可以用 R 执行此步骤吗 我的 xlsx contei
  • Jquery 下一个相邻选择器 $(this)

    我如何将相邻的选择器 与 this 一起使用 我需要有关注释行的帮助 this does not work ExpandCollapse click function if this nextUntil Collapsable is vis
  • JSONB 会让 PostgreSQL 数组变得无用吗?

    假设您想在对象 例如帖子 上存储 标签 在 9 4 版本中 您有 3 个主要选择 标签作为文本 标签为 jsonb 标签作为文本 并且您将 JSON 字符串存储为文本 在许多情况下 第三个是不可能的 因为它不允许对 标签 值进行条件查询 在
  • `istreambuf_iterator` 和 `istream_iterator` 之间的区别

    有什么区别istreambuf iterator and istream iterator 对于以下代码 istream iterator
  • 将 --net=host 传递给 docker build

    将其他选项传递给docker build 你可以指定DOCKER OPTS in etc default docker 但是 net 不可用 构建容器时是否可以使用主机的网络堆栈 我正在运行 Docker 版本 1 3 2 内部版本 39f
  • 删除“OPTIMIZE_FOR_SEQUENTIAL_KEY”会解决我的 script.sql 的失败问题还是涉及更多问题(SQL Server Express DB -> SQL Server)?

    我正在尝试在托管站点 GoDaddy Plesk 上将 SQL Server Express 数据库设置为成熟的 SQL Server DB 但在运行 script sql 文件时遇到了一系列错误消息 我正在按照步骤操作here https
  • Pandas 将值与前一行与过滤条件进行比较

    我有一个包含员工工资信息的数据框 大约有 900000 多行 Sample table num name salary 0 001234 John Johnson 1200 1 001234 John Johnson 1000 2 0012
  • 在 cartopy 墨卡托投影上绘制一个圆

    对于一个项目 我需要创建一个可视化效果 在地图上的某些位置周围绘制一个圆圈 使用的可视化卡托比 v 0 18 0 https scitools org uk cartopy docs latest index html渲染地图 它使用Goo
  • 我可以使用 display:inline 和 text-align: 对吗?

    Example td img src img src div style text align left hello world div td 从技术上讲 你可以 但不会有任何效果 Display inline 会将 div 显示为内联元素
  • python 当程序突然结束时如何保持json的完整性

    我在一个打开 10 个子进程的脚本中运行 多线程 每个子脚本都会查询 API 并将一些数据记录到 json 中 我将每个 json 保存在另一个 json 中 但是代码有时会突然结束并破坏 json 的完整性 因此无法重新打开它 例如 20
  • unity3d - 加速度计灵敏度

    我正在 Unity3D 4 3 中测试加速度计代码 我想做的就是在倾斜 ipad 的同时简单地改变物体角度 以像真实生活一样伪造视角 一切工作正常 除了加速计有点太敏感 即使我把它放在桌子上 我也可以看到游戏对象在闪烁 如何让它不那么敏感
  • 如何使用 MiniProfiler.Settings.CustomUITemplates

    再会 我在上一篇文章以及上一篇文章中都看过这里http miniprofiler com http miniprofiler com 但找不到任何有关如何使用的文档MiniProfiler Settings CustomUITemplate
  • Hibernate 排序依据最后为空

    Hibernate 与 PostgreSQL DB 一起使用时 按列对 desc 进行排序时 空值会高于非空值 SQL99 标准提供关键字 NULLS LAST 来声明空值应低于非空值 使用 Hibernate 的 Criteria API
  • 如何在 Django REST Framework 上启用 CORS

    如何在 Django REST Framework 上启用 CORS 这参考 http www django rest framework org topics ajax csrf cors 没有多大帮助 它说我可以通过中间件来完成 但我该
  • syn队列和accept队列的混淆

    在阅读TCP源码时 我发现一个困惑的事情 我知道 TCP 在 3 次握手中有两个队列 第一个队列存储服务器收到的连接SYN并发回ACK SYN 我们称之为同步队列 第二个队列存储3WHS成功并建立连接的连接 我们称之为接受队列 但在阅读代码
  • 用于多浏览器测试的 Specflow 的 DataSource 属性

    我有一些 C 中的 Web ui 测试 这些测试是通过 browserstack 中的 selenium 执行的 目前 这些只是简单的单位毫秒测试 它们是在不同的浏览器上执行的 我想将测试移植到specflow 但我真的不知道如何进行多浏览
  • Python http.client.RemoteDisconnected

    尝试使用 python 通过 Web 服务运行多个 ID 我收到 http client RemoteDisconnected 远程端关闭连接而没有响应 错误 我不想尝试 捕获此错误 我想调查为什么会收到此响应 我已经能够得到 400 和
  • java填充系统属性的源码有哪些

    Through System getProperty 字符串键 http docs oracle com javase 7 docs api java lang System html getProperty java lang Strin
  • Angular2测试表单:未调用提交方法

    有了这个组件 import Component from angular2 core import FORM DIRECTIVES from angular2 common Component selector something temp