首页 程序笔记 Angular UT报错Error: NG0100: ExpressionChangedAfterItHasBeenCheckedError

Angular UT报错Error: NG0100: ExpressionChangedAfterItHasBeenCheckedError

有一个Angular的Component的单元测试代码,执行后fixture.detectChanges();

就会报错Error: NG0100: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value for 'showLoading': 'true'. Current value: 'false'. Find more at https://angular.io/errors/NG0100。

代码是这样的,只是在ngAfterViewInit方法里修改了showLoading的值。

export class StartComponent implements AfterViewInit {
    showLoading = true;
    ngAfterViewInit(): void {
        this.showLoading = false;
    }
}

UT的代码是这样的:

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

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [StartComponent]
    })
      .compileComponents();
  });

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

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});

ExpressionChangedAfterItHasBeenCheckedError 错误通常发生在 Angular 的变更检测周期中,它表明在变更检测期间,某些表达式的值已经被修改,这与预期不符合。

在的情况下,fixture.detectChanges() 触发了变更检测,但在变更检测期间,某些属性(如 showLoading)的值发生了变化。由于 Angular 在变更检测期间检测到了这个不一致,因此抛出了 ExpressionChangedAfterItHasBeenCheckedError 错误。

解决这个问题的方法之一是使用 Angular 的生命周期钩子来进行处理。可以使用 ngAfterViewInit() 或 ngAfterContentInit() 钩子来在组件视图初始化完成后再执行的变更操作。这样可以确保在 Angular 完成视图的初始化之后再进行变更操作,避免了在变更检测周期内引起的不一致性。

另外,还可以使用 setTimeout() 来将变更操作推迟到下一个 JavaScript 事件循环中。这样可以使变更操作在 Angular 的变更检测周期之外进行,从而避免了错误的发生。

总之,避免在变更检测周期内修改属性值是解决这个错误的关键。使用 Angular 的生命周期钩子或将变更操作推迟到下一个 JavaScript 事件循环中是解决这个问题的两种常见方法。

1

站心网

有一个Angular的Component的单元测试代码,执行后fixture.detectChanges(); 就会报错Error: NG0100: Expres..

为您推荐

.NET C#中的Func、Predicate和Expression用法详解

在 .NET C# 中,Func、Predicate 和 Expression 是非常常见的委托类型和表达式树,广泛用于函数式编程、数据查询(如 LINQ)以及表达式编译等场景。以下是它们的详细用法和区别。1. FuncFunc 是一个通用委托,用于表..

Angular UT 模拟执行setTimeout

在 Angular 单元测试中,我们经常需要模拟异步操作,比如 setTimeout。提高测试速度: 真实环境下的 setTimeout 会阻塞测试,导致测试运行时间过长。确保测试的可靠性: 模拟 setTimeout 可以让我们更好地控制异步操..

Angular Mock 一个类的静态方法

理解 Angular Mock 和 静态方法在 Angular 单元测试中,Angular Mock 是一个强大的工具,它允许我们模拟和替换 Angular 的服务、组件和其他依赖项。而静态方法 是属于类本身,而不是类的实例的方法。它们可以直接通..

国外流行的前端框架有哪些?

国外流行的前端框架有很多,以下是一些常见且受欢迎的前端框架:React:由Facebook开发的JavaScript库,用于构建用户界面。它采用组件化的方式来构建复杂的UI,并具有高度的灵活性和性能优化。Angular:由Google开发..

Expression<Func<T1, T2>>与Func<T1, T2>的区别

Func<T1, T2>是委托(delegate)Expression<Func<T1, T2>>是表达式Expression编译后就会变成delegate,才能运行。比如Expression<Func<int, bool>> ex = x=>x < 100;Func<int, bool> func = ex.Compile();然后你就可以..

Angular scrollPositionRestoration回到顶部无效

从Angular6.1.0-beta1版本开始,Angular Router增加了scrollPositionRestoration、anchorScrolling 与 scrollOffset 配置项,用于定义路由导航中的位置处理。scrollPositionRestoration 可能的选项有:disabled:什..

Angular echarts No provider for InjectionToken NGX_ECHARTS_CONFIG!错误

npm install echartsnpm install ngx-echarts安装使用echarts运行时报如下错误ERROR NullInjectorError: R3InjectorError(IndexModule)[InjectionToken NGX_ECHARTS_CONFIG -> InjectionToken NGX_ECHARTS_CONFIG -..

Angular如何mock window对象

写单元测试时,有如下代码const localFile = window.URL.createObjectURL(this.pdfFile);这里想mock window对象,让createObjectURL随便返回一个对象。解决办法如下:beforeEach(async(()=>{(<any>window.URL.create..

Angular自定义验证器ValidatorFn单元测试

在项目中定义了自定义的验证器,代码如下:exportfunctionmyValidator(minNum):ValidatorFn{return(control:AbstractControl)=>{letflag=true;if(control.value<minNum&&control.value>0){flag=false;}return!flag?{..

React Error: Exceeded timeout of 5000 ms for a test. 错误

为React项目编写单元测试时报错Error: thrown: "Exceeded timeout of 5000 ms for a test. Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test."检查上下代码后是发现..

前端有必要学Angular吗?

学习Angular是否有必要取决于你的职业目标、项目需求和个人兴趣。Angular是一种流行的前端框架,适用于开发大型、复杂的Web应用程序。以下是一些考虑因素,可以帮助你决定是否学习Angular:1. 项目需求如果你的项目..

使用Eval-Expression.NET动态执行C#代码

我们都知道在JavaScript中,我们可以通过Eval来执行JavaScript字符串代码。下面推荐一个.Net版本的Eval的开源项目Eval-Expression.NET。Eval-Expression.NET GitHub地址:https://github.com/zzzprojects/Eval-Expre..

.NET8站点报错:HTTP Error 500.31 - Failed to load ASP.NET Core runtime

在IIS部署.NET8网站时报错:HTTP Error 500.31 - Failed to load ASP.NET Core runtime。服务器上已经安装了.NET8 X64运行时,如何解决?HTTP Error 500.31 - Failed to load ASP.NET Core runtimeCommon solutions ..

前端框架React,Angular和Vue.js 优缺点对比

React 和 Angular 适合大型应用开发,Vue.js 适合小型应用和初学者。以下是前端三大主流框架React,Angular和Vue.js 优缺点对比:1. React:优点:React 是一个非常灵活和高性能的框架,具有虚拟DOM的概念,可以实现..

Angular 17新特性

Angular 17是 Angular 的最新版本。该版本包括了许多新特性和改进,旨在提高 Angular 的性能、可维护性和可访问性。性能改进Angular 17 包括了许多性能改进,旨在提高 Angular 应用程序的性能。这些改进包括:新的 I..

Angular单元测试函数根据不同的参数returnValue不同的值

编写Angular单元测试时,有一个场景是某个函数被多次调用,在mock这个函数的返回值的时候希望根据不同的参数返回不同的值。当需要针对同一个函数根据不同的参数返回不同的值时,你可以使用 Jasmine 的 calls.fake() ..

Angular 17和Vue.js怎么选?

Angular 17和Vue.js都是流行的JavaScript前端框架,它们都具有自己的优势和劣势。Angular 17的优势:强大的功能:Angular 17提供了丰富的功能,可以满足复杂应用程序的需求。良好的性能:Angular 使用虚拟DOM,可以..

Angular新官网angular.dev正式发布

Angular 官推发布消息,Angular.dev 新官网正式发布。Angular新官网地址:https://angular.dev/Angular 于 2016 年首次推出,旨在帮助开发人员构建现代网络应用程序。纵观其发展历程,Angular 已使数百万开发人员获..

Angular 管道 Pipes用法示例

Angular 管道(Pipes)是一种用于在模板中对数据进行转换和格式化的机制。它们可以用于将日期、货币、文本等数据转换为所需的格式,以便在视图中显示。以下是一些常见的 Angular 管道用法示例:DatePipe:将日期对象..

Angular可能和Wiz完全合并成为新框架Wangular

谷歌工程师 Sarah Drasner 透露称,Angular 正在与谷歌内部自用的 JS 框架 Wiz 进行合并,当前两个团队正在进行一些研发合作。目前还不清楚 Angular 和 Wiz 是否会完全合并——成为新框架 Wangular(非官..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制