为什么 TestBed beforeeach 使用 waitForAsync 而不是仅仅使用 async/awaitcompileComponents?

2024-04-29

编辑:我在 Angular 上提出了一个问题,他们更新了文档 : https://github.com/angular/angular/issues/39740 https://github.com/angular/angular/issues/39740

在 Angular 测试中,通常的做法是为beforeEach method

    beforeEach(waitForAsync(() => {
      TestBed
          .configureTestingModule({
            declarations: [BannerComponent],
          })
          .compileComponents();  // compile template and css
    }));

与执行以下操作有什么区别?

    beforeEach(async () => {
      await TestBed
          .configureTestingModule({
              declarations: [BannerComponent],
          })
          .compileComponents();  // compile template and css
    });

我试图在文档中找到解释,但无法弄清楚。

https://angular.io/api/core/testing/waitForAsync#description https://angular.io/api/core/testing/waitForAsync#description https://v10.angular.io/guide/testing-components-scenarios#the-async-beforeeach https://v10.angular.io/guide/testing-components-scenarios#the-async-beforeeach


关于两种方法

我们有多种方法可以在测试角度操作时定义异步操作

  • using waitForAsync()

等待异步 https://angular.io/api/core/testing/waitForAsync

将测试函数包装在异步测试区域中。当该区域内的所有异步调用完成时,测试将自动完成。可用于包装注入调用。 来自文档

还需要注意的是,该方法是初始方法的重命名async.

async https://angular.io/api/core/testing/async罢工>

已弃用: use waitForAsync(),(预计在 v12 中删除)

async() 助手已重命名

测试辅助函数async已被弃用并重命名waitForAsync.

此重命名背后的原因是,使用名为的函数可能会令人困惑async()当我们现在有一个名为的 JavaScript 关键字时async(创建 Angular 函数时该关键字不存在),这有点相似(您可以await异步调用),但不同(async()等待所有异步调用,其中async只等待标有await 的调用)。

归功于Cédric Exbrayat 看这篇文章 https://blog.ninja-squad.com/2020/09/03/what-is-new-angular-10.1/#:%7E:text=The%20reason%20behind%20this%20renaming,async()%20waits%20for%20all

WaitForAsync函数在特殊的异步测试区域中执行其体内的代码。这会跟踪体内创建的所有承诺。该函数还跟踪嵌套函数创建的任何 Promise,例如,如果我们在 ngOnInit 函数中调用异步函数,这将被跟踪。

  • Using Async/ Await

基本上这使用了普通的 Javascriptasync\ await。我们将函数声明为异步并等待承诺解决

这两种方法有什么区别?

让我们考虑使用 5 种方法进行测试asyncMethod1,nonAsyncMethod1, asyncMethod2, asyncMethod3, nonAsyncMethod2.

Using async / await。我们需要做下面的事情

beforeEach(async () => {
   await asyncMethod1();
   nonAsyncMethod1(); 
   await asyncMethod2();
   await asyncMethod3();
   nonAsyncMethod2()
   await TestBed
      .configureTestingModule({
          declarations: [BannerComponent],
      })
      .compileComponents();  // compile template and css
});

using waitForAsync以上将是

beforeEach(waitForAsync(() => {
   asyncMethod1();
   nonAsyncMethod1(); 
   asyncMethod2();
   asyncMethod3();
   nonAsyncMethod2()
   TestBed
      .configureTestingModule({
        declarations: [BannerComponent],
      })
      .compileComponents();  // compile template and css
}));

所以一般在使用的时候async /await,我们需要在使用时跟踪所有异步操作waitForAsync一旦函数体中的所有承诺都得到解决,函数就会跟踪这个问题并解决承诺

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

为什么 TestBed beforeeach 使用 waitForAsync 而不是仅仅使用 async/awaitcompileComponents? 的相关文章

  • mat-tab-group 不是 Angular 9 中的已知元素

    我正在使用 Angular 9 和 Angular Material 9 2 4 我正在尝试使用mat tab 组在我的 component html 中 但我不断收到错误 mat tab group is not a known elem
  • Angular 2 - 加载时共享服务

    我正在尝试将服务共享给组件 为此 我创建了 service ts 其中代码如下 import Subject from rxjs Subject export class CommonService CommonList new Subje
  • Django:出于测试目的阻止互联网连接

    我想确保我的单元测试不会尝试连接到互联网 有没有办法在连接时引发异常 有一个类似的问题Python 出于测试目的阻止网络连接 https stackoverflow com questions 18601828 python block n
  • Webpack 在 Angular 的 ng 服务中的作用

    我是 Angular 的新手 想知道当我们为应用程序提供服务时 Webpack 在幕后扮演什么角色 在最初的印象中 我开始知道 webpack 是一个构建和打包工具 它将所有必需的 JS 文件分组到单独的包中 然而 我无法找到 webpac
  • 无法在 Angular 10 中的“pdf-viewer”=>“ng2-pdf-viewer”中显示 blob url

    我有一个 API 它将上传的文件作为 blob 返回 当我尝试绑定时src如果使用 blob URL 则它不会显示任何内容 但是 当我尝试绑定直接 URL 时 它可以显示 PDF 文件 这是我下面给出的代码 我的 TS 代码 downloa
  • 获取“回调 URL 与 Auth0 不匹配”

    我有一个 Auth0 客户端 配置了以下回调 URL http 本地主机 4200 http localhost 4200 我可以正常登录 问题是当我导航到应用程序中的某个 URL 时 http localhost 4200 places
  • 无法在 Angular 4 中使用自定义主题

    我正在尝试在我的角度项目中使用我的自定义主题 它没有按预期工作 我收到以下错误 node modules css loader sourceMap false importLoaders 1 node modules postcss loa
  • 如何在 ngrx/effects 中执行 if/else 操作?

    我正在使用 ngrx effects 我想根据以下情况分派不同的操作foo商店里的状态 这就是我现在正在做的 Effect foo1 this updates whenAction Actions FOO filter obj gt obj
  • 跨延迟加载路由创建共享模块

    我正在构建一个 Angular 11 应用程序并尝试创建一个SharedModule 我正在使用延迟加载 并希望避免在延迟加载的路由中多次加载公共模块 我创建了一个共享模块并将其导入到我的AppModule 根据我的理解 这个共享模块应该在
  • 如何测试包含自定义表单控件的组件?

    我有一个这样的组件 Component selector app custom form control templateUrl
  • Angular 9:上传图像时如何将 HEIF 文件格式转换为已知的 Web 格式

    我正在维护一个用 Angular 9 编写的 Web 应用程序 PWA 用户可以在 Cropperjs 中上传图像并裁剪 旋转等 在 iOS 上 新的图像格式 HEIF 正在成为标准 这些用 户抱怨他们无法上传照片 似乎iOS有时会自动转换
  • 如何使用 *ngFor 迭代对象键

    我想在 Angular 2 中使用 ngFor 迭代 object object 问题是该对象不是对象的数组 而是包含更多对象的对象的对象 data id 834 first name GS last name Shahid phone 0
  • Angular2 与 Jquery-ui 滑块

    我尝试将 Jquery ui 滑块与 angular2 一起使用 我想让变量 slideValue 显示滑块的值 但我不知道如何将我的模型或变量从角度绑定到滑块 这是我的滑块组件 import Component ElementRef In
  • 如何将脚本作为 pytest 测试运行

    假设我有一个用简单脚本表示的测试assert 陈述 请参阅背景了解原因 例如 import foo assert foo 3 4 我如何以一种好的方式将该脚本包含在我的 pytest 测试套件中 我尝试了两种有效但不太好的方法 一种方法是将
  • Expresso 的 Android 测试首选项片段

    我在通过 Expresso 测试我的代码时遇到问题 我写了这段代码 public class SettingsActivity extends Activity Override protected void onCreate Bundle
  • 元素不适应 Firefox 上的

    使用 ES6 ish D3js 模块运行 Angular 6 应用程序会导致 Firefox 出现问题 Chromium Chrome Safari 和 IE Edge 工作正常 伪代码看起来类似于 生产代码可以在下面找到
  • 415 不支持的媒体类型; Angular2 到 API

    我是 Angular 2 的新手 我面临着一个无法找到解决方案的问题 当我尝试从 Angular 2 发布到 API 时 我得到 415 不支持的媒体类型 角度2代码 onSubmit value any console log value
  • Angular 2:使用正则表达式进行数字验证

    我正在尝试验证 IE 11 中的数字字段
  • 从同步上下文调用异步方法

    我在代码中通过 HTTP 调用服务 最终使用 HttpClient SendAsync 方法 然后从 WebAPI 控制器操作调用此代码 大多数情况下 它工作得很好 测试通过 但是当我在 IIS 上部署时 我遇到了死锁 因为异步方法调用的调
  • 资产未考虑基本 href url - 未找到错误

    我刚刚在 Webform 项目中复制了 Angular 构建脚本 并将该项目部署到 IIS 中 注意 我只复制了脚本文件 没有单独部署在 IIS 中 我已将 Angular dist 文件夹复制到 Webform 项目的 Scripts 文

随机推荐