【问题标题】:Angular Karma testing prototype functionAngular Karma 测试原型功能
【发布时间】:2020-02-06 11:25:38
【问题描述】:

当我尝试运行 ng test 时,我收到一个错误

类型“FormArray”上不存在属性“myFunction”

而且它是一个添加到 app.module.ts 以使其全局化的属性。

它是扩展 AbstractControl 添加 myFunction 的原型,因此可以在 AbstractControl 对象上调用它。 (完全像这里https://stackoverflow.com/a/47065916

我可以做些什么来让 Karma 承认它被正确使用或让它忽略它?

编辑: 完全错误:

app/modules/settings/components/some-folder/some-folder2/some-folder3/some-folder4/myComponent.component.ts:74:23 中的错误 - 错误 TS2339:属性 'myFunction' 不存在输入“FormArray”。

74 myFormArray.addValidators([MyValidator(someList)]);

【问题讨论】:

  • 请提供代表错误的实际代码。
  • 你能分享一个失败的测试代码吗?
  • 我在编辑中添加了完整的错误,但它与之前添加的基本相同

标签: angular testing karma-jasmine


【解决方案1】:

当您运行测试时,app.module 不会被隐式导入,因此您扩展原型的代码不会被运行。

所以你要么

  • 在您的TestBed.configureTestingModule 中导入整个app.module,这不是一个好习惯,因为它会引入所有依赖项,
  • 或创建一个测试模块,在其中运行原型扩展代码,并仅导入必要的依赖项(例如,表单模块(包含FormArray),可能还有一些组件或服务)
  • 或者只是在beforeEach 中运行原型扩展代码,所以当您的测试到达有表单的部分时,原型已经扩展了
beforeEach(() => {
    // just paste the prototype extending code here, something like the following
    AbstractControl.prototype.myFunction = () => {
        // ...
    }

    // or even better, if you extracted the function above to somewhere
    extendAbstractControl();
});`

【讨论】:

  • 您能否就“创建一个运行原型扩展代码的测试模块”进行更多合作
  • 并且通过“或者只是在 beforeEach 中运行一个原型扩展代码,所以当你的测试到达有表单的部分时,原型已经扩展了”你的意思只是将我的代码粘贴到之前每个?因为原型不是我可以导入的组件
  • 1.关于测试模块,请在angular.io/guide/testing#angular-testbed 阅读更多内容。 2. 确切地说,或者可能将该代码提取到一个 util 文件中,这样您就不必到处复制它,只需导入并调用它。
  • 非常感谢亚历克斯。我现在明白了,所有选项都有效。很好的答案
  • 关于 AppModule,您说这是个坏主意,但是如果我将导入添加到我的共享模块中,并且我需要在测试中导入它,该怎么办?
猜你喜欢
  • 2018-01-31
  • 1970-01-01
  • 2021-11-30
  • 2015-12-07
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 2019-12-03
相关资源
最近更新 更多