首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Angular 2单元测试在嵌套ngModel元素时必须多次调用whenStable

这个问题涉及到Angular 2的单元测试和ngModel元素的嵌套。在Angular中,ngModel是一个指令,用于在表单控件和模型之间建立双向数据绑定。当ngModel元素嵌套时,可能会导致测试中的异步行为,因此需要多次调用whenStable方法来确保测试的稳定性。

具体来说,当在单元测试中使用Angular的TestBed来创建组件并进行测试时,当涉及到ngModel元素的嵌套时,可能会出现异步行为。这是因为ngModel元素的值可能会在一次变更检测周期中更新,而测试代码可能在此之前就已经执行完毕。

为了解决这个问题,我们可以在测试代码中多次调用whenStable方法。whenStable方法返回一个Promise,当所有异步任务都完成时,Promise会被解析。通过在每次调用whenStable后执行断言,我们可以确保测试代码在所有异步任务完成后再进行断言。

以下是一个示例代码,演示了如何在嵌套ngModel元素时多次调用whenStable方法:

代码语言:typescript
复制
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { FormsModule } from '@angular/forms';
import { MyComponent } from './my.component';

describe('MyComponent', () => {
  let component: MyComponent;
  let fixture: ComponentFixture<MyComponent>;

  beforeEach(waitForAsync(() => {
    TestBed.configureTestingModule({
      imports: [FormsModule],
      declarations: [MyComponent]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should update nested ngModel value', waitForAsync(() => {
    component.myValue = 'Test Value';
    fixture.detectChanges();

    fixture.whenStable().then(() => {
      // First whenStable callback
      expect(component.nestedValue).toBe('Test Value');

      // Update nested ngModel value
      component.nestedValue = 'Updated Value';
      fixture.detectChanges();

      fixture.whenStable().then(() => {
        // Second whenStable callback
        expect(component.myValue).toBe('Updated Value');
      });
    });
  }));
});

在上面的示例代码中,我们创建了一个名为MyComponent的组件,并在其中嵌套了ngModel元素。在测试代码中,我们首先设置了myValue的值,并调用fixture.detectChanges()来触发变更检测。然后,我们通过多次调用whenStable方法来确保异步任务的完成,并在每次回调中执行断言。

需要注意的是,为了在测试代码中使用ngModel,我们需要在TestBed的配置中导入FormsModule。

总结起来,当在Angular 2单元测试中遇到嵌套ngModel元素时,为了确保测试的稳定性,我们需要多次调用whenStable方法来处理异步行为。这样可以确保在所有异步任务完成后再进行断言,从而得到准确的测试结果。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Angular 从入坑到挖坑 - 组件食用指南

="expr">NgIf 结构型指令 当 expr 属性为 true ,这个元素则会显示页面上,当属性值为 false ,则不显示该元素 ngIf 指令并不是通过使用 css 样式来隐藏元素的...,当值为 false ,则这些元素会从 dom 中被销毁,并且所有监听该 dom 元素的事件会被取消,当重新显示该元素,会重新执行初始化的过程 与销毁元素不同,对于隐藏的元素来说,所有的元素监听事件还会执行监听的...,会获取到条数据的索引值 当渲染的数据发生改变 4,会导致 dom 元素的重新渲染,此时可以采用 trackBy 的方式,通过组件中添加一个方法,指定循环需要跟踪的属性值,此时当渲染的数据发生改变...被绑定的输入属性值发生变化时触发,会调用多次;如果没有使用到父子组件传值,则不会触发 ngOnInit 初始化组件时会调用一次,一般是用来构造函数之后执行组件复杂的初始化逻辑 ngDoCheck 只要数据发生改变就会被调用...一般用来对视图的 dom 元素进行操作 ngAfterViewChecked 视图发生变化时调用组件的生命周期中会调用多次 ngOnDestroy 只销毁组件时调用一次,一般用来组件销毁前执行某些操作

15.8K30
  • Angular 6.x 表单快速入门

    Driven 表单的特点 使用方便 适用于简单的场景 通过 [(ngModel)] 实现数据双向绑定 自动生成 Form Model (异步) 最小化组件类的代码 不易于单元测试 Reactive 表单的特点... Angular 表单中,我们通过 ngModel 指令来实现双向绑定。... Angular 中,我们可以通过 #userName="ngModel" 方式获取 ngModel 对象,然后通过 userName.valid 判断表单控件是否通过验证。... Angular 中,我们可以通过 #userName="ngModel" 方式获取 ngModel 对象,然后通过该对象的 errors 属性,来获取对应验证规则 (如 required, minlength... Angular 中表单控件有以下状态,我们可以通过 #userName="ngModel" 方式获取 ngModel 对象,进而获取控件的状态信息。

    4.6K20

    AngularDart4.0 指南- 模板语法二 顶

    当用户点击Delete,组件的delete()方法被调用,指示StreamController将Hero添加到stream中。...[()] =香蕉盒 一个盒子里形象化一个香蕉,记住圆括号括号内。 当元素有一个名为x的可设置属性和一个名为xChange的对应事件,[(x)]语法很容易演示。...NgModel - 与[(ngModel)]形成元素的双向绑定 开发数据输入表单,通常都会显示数据属性,并在用户进行更改时更新该属性。 使用NgModel指令进行双向数据绑定使得这一切变得简单。...如果嵌套表达式试图访问null属性,Angular会抛出一个错误。 这里我们看到NgIf守护两个。 currentHero名称仅在有currentHero出现。...声明输入和输出属性 目标属性必须明确标记为输入或输出。 HeroDetailComponent中,这些属性使用注解标记为输入或输出属性。

    30K20

    Angular学习资料大全和常用语法汇总(让后端程序员轻松上手)

    要想在双向数据绑定中使用 ngModel 指令,必须先导入 FormsModule 并将其添加到 NgModule 的 imports 列表中。...元素使用的 CSS 类 ng-class-even 类似 ng-class,但只偶数行起作用 ng-class-odd 类似 ng-class,但只奇数行起作用 ng-click 定义元素被点击的行为...ng-cloak 应用正要加载防止其闪烁 ng-controller 定义应用的控制器对象 ng-copy 规定拷贝事件的行为 ng-csp 修改内容的安全策略 ng-cut 规定剪切事件的行为...规定鼠标指针穿过元素的行为 ng-mouseleave 规定鼠标指针离开元素的行为 ng-mousemove 规定鼠标指针指定的元素中移动的行为 ng-mouseover 规定鼠标指针位于元素上方的行为...ng-mouseup 规定当在元素上松开鼠标按钮的行为 ng-non-bindable 规定元素或子元素不能绑定数据 ng-open 指定元素的 open 属性 ng-options <select

    5.3K41

    Angular核心概念:数据绑定

    (达内教育学习笔记)仅供学习交流 Angular数据绑定 Angular核心概念:数据绑定(1)HTML绑定:{{NG表达式}}(2)属性绑定(3)指令绑定(4)事件绑定()(5)双向数据绑定指令...:[(ngModel)]---重点 Angular核心概念:数据绑定 (1)HTML绑定:{{NG表达式}} (2)属性绑定 (3)指令绑定 (4)事件绑定() (5)双向数据绑定指令:[(ngModel...DOM树结构,必须使用开头,如ngFor,*ngIf 3.属性型指令:不会影响DOM树结构,只是影响元素外观或行为,必须用[]括起来,如 :[ngClass],[ngStyle] <container-element...() (5)双向数据绑定指令:[(ngModel)]—重点 方向1:Model=》View,模型变则视图变,用[]绑定 方向2:View=》Model,视图(表单元素)变则模型变,用()绑定 <input...ngModel指令FormsModule模块中,使用之前必须添加 app.module.ts主模块中导入模块 import {FormsModule} from'@angular/forms'

    3.5K10

    Angular 从入坑到挖坑 - 表单控件概览

    表单验证 指令 函数 表单数据发生变更,模板驱动表单通过修改 ngModel 绑定的数据模型来完成数据更新,而响应式表单在表单数据发生变更,FormControl 实例会返回一个新的数据模型,...使用 ngModel 进行模板绑定时,angular form 标签上自动附加了一个 NgForm 指令,因为 NgForm 指令会控制表单中带有 ngModel 指令和 name 属性的元素,而...name 属性则是 angular 用来注册控件的 key,所以表单中使用 ngModel 进行双向数据绑定时,必须要添加 name 属性 4.2.2、跟踪表单控件的状态 表单中使用 ngModel...,从而生成错误信息列表 进行用户输入数据有效性验证控件上通过添加一个模板引用变量来暴露出 ngModel,从而在模板中获取到指定控件的状态信息,之后就可以通过获取错误信息列表来进行反馈 <div...当构建复杂表单,可以 FormGroup 中通过嵌套 FormGroup 使表单的结构更合理 import { Component, OnInit } from '@angular/core';

    18.9K20

    Angular 英雄编辑器

    CSS 元素选择器 app-heroes 用来父组件的模板中匹配 HTML 元素的名称,以识别出该组件。...ngOnInit 是一个生命周期钩子(lifecycle hook),Angular 创建完组件后很快就会调用 ngOnInit。这里是放置初始化逻辑的好地方。...虽然 ngModel 是一个有效的 Angular 指令,不过它在默认情况下是不可用的。 它属于一个可选模块 FormsModule,你必须自行添加此模块才能使用该指令。...你可以编辑英雄的名字,并且会看到这个改动立刻体现在这个输入框上方的  中。 声明 HeroesComponent 每个组件都必须声明(且只能声明)一个 NgModule 中。...你用 ngModel 指令实现了双向数据绑定。 你知道了 AppModule。 你把 FormsModule 导入了 AppModule,以便 Angular 能识别并应用 ngModel 指令。

    2.5K50

    Angular 英雄编辑器

    CSS 元素选择器 app-heroes 用来父组件的模板中匹配 HTML 元素的名称,以识别出该组件。...ngOnInit 是一个生命周期钩子(lifecycle hook),Angular 创建完组件后很快就会调用 ngOnInit。这里是放置初始化逻辑的好地方。...虽然 ngModel 是一个有效的 Angular 指令,不过它在默认情况下是不可用的。 它属于一个可选模块 FormsModule,你必须自行添加此模块才能使用该指令。...你可以编辑英雄的名字,并且会看到这个改动立刻体现在这个输入框上方的  中。 声明 HeroesComponent 每个组件都必须声明(且只能声明)一个 NgModule 中。...你用 ngModel 指令实现了双向数据绑定。 你知道了 AppModule。 你把 FormsModule 导入了 AppModule,以便 Angular 能识别并应用 ngModel 指令。

    2.6K70

    AngularDart4.0 指南-体系结构概述 顶

    = null" [hero]="selectedHero"> 虽然这个模板使用了典型的HTML元素,如和,但它也有一些不同之处。...当用户点击英雄的名字,(click)事件绑定调用组件的selectHero方法。 双向数据绑定是一个重要的第四种形式,它使用ngModel指令将属性和事件绑定在一个符号中。...Dart版本必须使用布尔运算符!=替换。 属性指令会改变现有元素的外观或行为。 模板中,它们看起来像常规的HTML属性,因此也就是名称。...实现双向数据绑定的ngModel指令是一个属性指令的例子。 ngModel通过设置其显示值属性并响应更改事件来修改现有元素(通常是)的行为。...如果请求的服务实例不在容器中,那么将服务返回给Angular之前,注入器将创建一个并将其添加到容器中。 当所有请求的服务已经解析并返回Angular可以用这些服务作为参数调用组件的构造函数。

    7.9K30

    AngularDart4.0 指南- 表单 顶

    开发表单,创建一个数据录入体验非常重要,该体验可以通过工作流高效地引导用户。...使用模板引用变量HTML元素之间共享信息。 您可以Plunker中运行实例(查看源代码)并从那里下载代码。...使用* ngFor添加powers 英雄必须从一个固定的机构批准的权力列表中选择一个超级大国。 您在内部维护该列表(HeroFormComponent中)。...每个input元素都有一个ngControl指令,Angular表单需要用这个指令表单上注册控件。 如果您现在运行应用程序并更改每个英雄model属性,表单可能会显示如下: ?...如果没有Angular的帮助,你需要做什么才能将按钮的启用/禁用状态连接到表单的有效性? 对你来说,这很简单: (增强的)表单元素上定义一个模板引用变量。 多处的按钮中引用该变量。

    17.5K30

    4、Angular JS 学习笔记 – 创建自定义指令

    匹配指令 我们写一个指令前,我们需要知道Angular的HTML编译器决定何时使用给定的指令。 在下面的例子中,我们说这个元素匹配ngModel指令。... 下面的代码也匹配ngModel: 标准化 Angular标准化一个元素的标签和属性名称去确定一个元素匹配哪个指令...我们通常引用指令通过区分大写小的驼峰标准名称(例如 ngModel)。不过,HTML是不区分大小写的,我们DOM上引用指令通过小写方式,通常在元素上使用中划线分割属性名(例如 ng-model)。...Angular调用templateUrl函数基于两个参数,一个是指令是在哪个元素上被调用,和一个attr属性关联相关的元素。...这在构建可复用组件很有用,因为它防止组件修改你的model状态只是你明确允许的哪些。

    4.8K20

    AngularDart4.0 英雄之旅-教程-04明细 顶

    应用程序重构 添加新功能之前,您可以从应用程序重构中受益。 应用模板文件 您将对应用程序组件的模板进行多次更新。...刷新浏览器,该应用程序不再失败,名称列表再次显示浏览器中。 当没有选定的英雄,ngIf指令从DOM中移除英雄详情HTML。 没有英雄细节元素或绑定担心。...当用户选择一个英雄,selectedHero变为非null,ngIf将英雄详细内容放入DOM中,并评估嵌套的绑定。...模板中,将以下绑定添加到标记中: [class.selected]="hero === selectedHero" 当表达式(hero === selectedHero)为trueAngular...当表达式为falseAngular删除选定的类。 ===运算符测试给定的对象是否相同。 模板语法指南中阅读有关[class]绑定的更多信息。

    3K30

    Angular学习笔记(一)

    指令 Angular 模板是动态的。当 Angular 渲染它们,它会根据指令提供的操作对 DOM 进行转换。 服务 服务是一个广义范畴,包括:值、函数,或应用所需的特性。...'red' : 'green'"> 内置属性型指令 NgClass - 添加或移除一组CSS类 NgStyle - 添加或移除一组CSS样式 NgModel - 双向绑定到HTML表单元素...ngOnInit() Angular 第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。 第一轮 ngOnChanges() 完成之后调用,只调用一次。...每个 Angular 变更检测周期中调用,ngOnChanges() 和 ngOnInit() 之后。 ngAfterContentInit() 当把内容投影进组件之后调用。...ngAfterViewInit() 和每次 ngAfterContentChecked() 之后调用。 只适合组件。 ngOnDestroy Angular 销毁指令/组件之前调用

    3.3K20

    Angular—都2019了,你还对双向数据绑定念念不忘

    原文:https://zhuanlan.zhihu.com/p/58787662 双向数据绑定是AngularJs的一大卖点,当初问世开发人员无不惊讶,“Wow, it's so crazy"。...于是乎,goolge2016年推出了angular彻底改变了检测机制,这次并没有大力吆喝双向数据绑定,但仍会有人习惯的问一句,“有没双向数据绑定?”。如果你只是随口一问,我会告诉你,有。...Angular中的写法: // component.ts ... name = 'John'; ......不看源码的情况下,如果是让你去实现 ngModel 这个指令,相信你肯定有思路。 肯定要把输入属性 ngModel 和input元素的value值关联起来。...2. 定义一个输出属性,名称就是输入属性名加‘Change’后缀(如:nameChange)。 3. 确保nameChange输出最新的值。

    4.4K30

    Angular ViewChild和ViewChildren

    ViewChild Angular 为我们提供 ViewChild 和 ViewChildren 装饰器来获取模板视图中匹配的元素。ViewChild 是属性装饰器,用来从模板视图中获取匹配的元素。...视图查询 ngAfterViewInit 钩子函数调用前完成,因此 ngAfterViewInit 钩子函数中,就能正常获取查询的元素。...组件类,使用 ViewChild 装饰器来获取邮箱输入框的元素引用: @ViewChild('email') email: ElementRef; 最后 ngAfterViewInit 生命周期钩子中输出...nativeElement 属性,你会发现该属性对应的值是原生的 DOM 元素,因此我们可以 ngAfterViewInit 生命周期钩子中执行某些 DOM 操作: ngAfterViewInit(...为了能够支持跨平台,Angular 通过抽象层封装了不同平台的差异,统一了 API 接口。如定义了抽象类 Renderer2 、抽象类 RootRenderer 等。

    2.7K20
    领券