TypeError:无法使用玩笑读取未定义的属性“原型”

Posted

技术标签:

【中文标题】TypeError:无法使用玩笑读取未定义的属性“原型”【英文标题】:TypeError: Cannot read property 'prototype' of undefined using jest 【发布时间】:2019-09-24 20:33:02 【问题描述】:

我正在使用 jest 框架对我的 Angular 应用程序进行单元测试。我认为 zone.jstest.ts 文件有问题。

我收到错误堆栈跟踪

TypeError: Cannot read property 'prototype' of undefined

      3 | import  getTestBed  from '@angular/core/testing';
      4 | import 'zone.js/dist/zone-testing';
    > 5 | import 
        | ^
      6 |   BrowserDynamicTestingModule,
      7 |   platformBrowserDynamicTesting
      8 |  from '@angular/platform-browser-dynamic/testing';

      at __extends (node_modules/zone.js/dist/zone-testing.js:394:73)
      at node_modules/zone.js/dist/zone-testing.js:530:9
      at node_modules/zone.js/dist/zone-testing.js:619:7
      at node_modules/zone.js/dist/zone-testing.js:620:3
      at Object.<anonymous>.NEWLINE (node_modules/zone.js/dist/zone-testing.js:9:65)
      at Object.<anonymous> (node_modules/zone.js/dist/zone-testing.js:12:2)
      at Object.<anonymous> (src/test.ts:5:1

我正在寻找一种方法来以最少的代码更改来解决此问题。

我已经尝试适应 https://github.com/AlexanderZaytsev/react-native-i18n/issues/233 和Jest: TypeError: Cannot read property of undefined 没有任何运气。

另外,我已经尝试过文档,但它没有指定与此相关的任何内容,或者我错过了它。

这是我的 test.ts 文件。

import  getTestBed  from '@angular/core/testing';
import 'zone.js/dist/zone-testing';
import 
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting
 from '@angular/platform-browser-dynamic/testing';

declare const require: any;

// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting()
);
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);

我用过compilerOptions

    "esModuleInterop": true,
    "module": "es2015",

正如我所说,我正在寻找一种通过最少的代码更改来解决此问题的方法。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

如果您已完全迁移到 Jest,您可以删除 test.ts,因为您不再使用 Jasmine 和 Karma,因此不再需要它。你可以阅读here。

另外,请确保从 tsconfig.spec.ts 中删除其引用。

如果由于某种原因需要保留它,可以忽略 Jest 配置中的 test.ts 文件,因为默认情况下,jest 会测试所有以 spec.ts/js 和 test.ts/js 结尾的文件。

**Default configuration:** 
testMatch: [ "**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[jt]s?(x)" ]

**Change to:**
testMatch: [ "**/__tests__/**/*.[jt]s?(x)", "**/?(*.spec).[jt]s?(x)" ]

您可以阅读更多关于配置 Jest here

【讨论】:

感谢您的解决方案。我之前也试过。然后它产生了以下错误。 TypeScript diagnostics (customize using '[jest-config].globals.ts-jest.diagnostics' option): error TS6053: File '.../Sample-Login-App_jest/src/test.ts' not found. 经过一番修改,我看到 tsconfig.spec.ts 文件包含 test.ts 文件在它的 files 数组中。在我删除它之后,测试工作正常。谢谢 太好了,我会用它来更新答案。可能会帮助别人。 :)

以上是关于TypeError:无法使用玩笑读取未定义的属性“原型”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?

TypeError:无法使用 React 读取未定义的属性

开玩笑:无法窥探该属性,因为它不是函数;给定的未定义

TypeError:无法读取未定义的属性(读取“名称”)

“TypeError:无法读取未定义的属性‘scopedFn’”。这是啥?

TypeError:使用状态时无法读取未定义的属性“0”