Angular 2 单元测试:找不到名称“描述”

Posted

技术标签:

【中文标题】Angular 2 单元测试:找不到名称“描述”【英文标题】:Angular 2 Unit Tests: Cannot find name 'describe' 【发布时间】:2016-12-25 11:48:40 【问题描述】:

我关注this tutorial from angular.io

正如他们所说,我创建了 hero.spec.ts 文件来创建单元测试:

import  Hero  from './hero';
describe('Hero', () => 
  it('has name', () => 
    let hero: Hero = id: 1, name: 'Super Cat';
    expect(hero.name).toEqual('Super Cat');
  );
  it('has id', () => 
    let hero: Hero = id: 1, name: 'Super Cat';
    expect(hero.id).toEqual(1);
  );
);

单元测试就像一个魅力。问题是:我看到一些错误,教程中提到了:

我们的编辑器和编译器可能会抱怨他们不知道itexpect 是因为它们缺少描述的打字文件 茉莉花。我们可以暂时忽略那些烦人的抱怨 无害。

他们确实忽略了它。尽管这些错误是无害的,但当我收到一堆错误时,它在我的输出控制台中看起来并不好。

我得到的示例:

找不到名称“描述”。

找不到名称“它”。

找不到名字'expect'。

我能做些什么来解决它?

【问题讨论】:

您可以在 Github 上投票以修复此错误:github.com/TypeStrong/atom-typescript/issues/1125 【参考方案1】:

我在 Angular 库中遇到了这个错误。原来我不小心将我的 .spec 文件包含在我的 public-api.ts 的导出中。删除导出解决了我的问题。

【讨论】:

【参考方案2】:

如果错误在 .specs 文件中 app/app.component.spec.ts(7,3):错误 TS2304:找不到名称“beforeEach”。

将此添加到文件顶部并 npm install rxjs

从'rxjs'导入范围; 从 'rxjs/operators' 导入 map, filter ;

【讨论】:

为什么安装和导入未使用的函数有助于解决打字问题?我怀疑这真的是一个有效的答案【参考方案3】:

在我的情况下,我在提供应用程序时收到此错误,而不是在测试时。我没有意识到我的 tsconfig.app.json 文件中有不同的配置设置。

我以前有这个:


  ...
  "include": [
    "src/**/*.ts"
  ]

在提供应用程序时,它包括了我所有的 .spec.ts 文件。我更改了include property toexclude` 并添加了一个正则表达式来排除所有测试文件,如下所示:


  ...
  "exclude": [
    "**/*.spec.ts",
    "**/__mocks__"
  ]

现在它可以按预期工作了。

【讨论】:

【参考方案4】:

只需执行以下操作即可在 Lerna Mono-repo 中获取 @types 其中存在多个 node_modules。

npm install -D @types/jasmine

然后在每个模块或app的每个tsconfig.file中

"typeRoots": [
  "node_modules/@types",
  "../../node_modules/@types" <-- I added this line
],

【讨论】:

默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的 node_modules/@types 中的包都被认为是可见的;具体来说,这意味着 ./node_modules/@types/、../node_modules/@types/、../../node_modules/@types/ 等中的包。见official documentation【参考方案5】:

我到今天为止是最新的,发现解决这个问题的最佳方法是什么都不做...不typeRootstypesexcludeinclude所有默认值似乎都是工作得很好。实际上,在我将它们全部删除之前,它并不适合我。我有:

"exclude": [
    "node_modules"
]

但这是默认设置,所以我删除了它。

我有:

"types": [
    "node"
]

克服一些编译器警告。但现在我也删除了它。

不应该的警告是: error TS2304: Cannot find name 'AsyncIterable'. 来自node_modules\@types\graphql\subscription\subscribe.d.ts

这非常令人讨厌,所以我在 tsconfig 中做了这个,以便它加载它:

"compilerOptions": 
    "target": "esnext",

因为它在 esnext 集中。我没有直接使用它,所以暂时不用担心兼容性。希望以后不会烧到我。

【讨论】:

您不需要在tsconfig.json 中添加"types": ["node"],但您应该在tsconfig.app.json 中添加此类型!我认为你不应该再收到这个警告。您现在可以保留"target": "es5""target": "es6"【参考方案6】:

我希望你已经安装了 -

npm install --save-dev @types/jasmine

然后将以下导入放在hero.spec.ts 文件的顶部 -

import 'jasmine';

应该能解决问题。

【讨论】:

根据所需的 Typescript 版本,您可能需要安装早期版本。例如,对于我目前使用的使用 typescript v2.0.9 的 ionic v2.2.1,我需要安装 @types/jasmine@2.5.41。否则你可能会看到these compilation errors。 你可以只导入模块来获得它的副作用:import 'jasmine'; import from 'jasmine'; 实际上是做什么的?和import 'jasmine'一样吗? IN ANGULAR 6.0.3:我刚刚导入“import from jasmine”,它又可以工作了 @aesede 你运行什么版本的 PS?我刚刚执行了没有任何引号的命令,并且运行良好。【参考方案7】:

您需要为 jasmine 安装类型。假设您使用的是相对较新的 typescript 2 版本,您应该能够做到:

npm install --save-dev @types/jasmine

【讨论】:

【参考方案8】:

我正在使用 Angular 6、Typescript 2.7,并且正在使用 Jest 框架进行单元测试。 我安装了@types/jest 并添加到typeRootstsconfig.json

但是下面还是有显示错误(即终端没有错误)

找不到名称描述

并添加导入:

import  from 'jest'; // in my case or jasmine if you're using jasmine

从技术上讲并没有做任何事情,所以我想,有一个导入导致这个问题,然后我发现,如果删除文件

tsconfig.spec.json

src/ 文件夹中,为我解决了这个问题。因为 @types 是在 rootTypes 之前导入的。

我建议你这样做并删除这个文件,里面不需要配置。 (ps:如果你和我一样的话)

【讨论】:

【参考方案9】:

我将在 "typescript": "3.2.4" 中添加对我有用的答案:-

安装类型茉莉npm install -D @types/jasmine

添加到 tsconfig.json jasmine/ts3.1

"typeRoots": [ ... "./node_modules/jasmine/ts3.1" ],

将 Jasmine 添加到类型中

"types": [ "jasmine", "node" ],

注意:不再需要这个import 'jasmine';

【讨论】:

【参考方案10】:

为了使 TypeScript 编译器在编译期间使用所有可见的类型定义,应从 tsconfig.json 文件中的 compilerOptions 字段中完全删除 types 选项。

compilerOptions 字段中存在一些types 条目,同时缺少jest 条目时,就会出现此问题。

因此,为了解决此问题,tscongfig.json 中的 compilerOptions 字段应在 types 区域中包含 jest 或完全删除 types


  "compilerOptions": 
    "esModuleInterop": true,
    "target": "es6",
    "module": "commonjs",
    "outDir": "dist",
    "types": ["reflect-metadata", "jest"],  //<--  add jest or remove completely
    "moduleResolution": "node",
    "sourceMap": true
  ,
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "node_modules"
  ]

【讨论】:

这对我有用,我在types 选项中有google map types。完全删除该选项后,它工作正常。 是的。我只需要删除类型的东西就可以了! 【参考方案11】:

使用 Typescript@2.0 或更高版本,您可以安装类型:

npm install -D @types/jasmine

然后使用tsconfig.json中的types选项自动导入类型:

"types": ["jasmine"],

此解决方案不需要在每个规范文件中都有import from 'jasmine';

【讨论】:

根据 tsconfig.json 的 TypeScript 文档(此时为 v2.1),不再需要添加 "types": ["jasmine"] 行。 “默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的 node_modules/@types 中的包都被认为是可见的;具体来说,这意味着 ./node_modules/@types/、../node_modules/@ 中的包types/、../../node_modules/@types/ 等等。” @bholben 我知道,但由于某种原因,nodejasmine 类型未被检测到。至少它对我不起作用,我正在使用 Typescript@2.1.5 这个解决方案对我不起作用 :(,抱歉。我在ang-app/e2e/tsconfig.json 中使用过它。我在每个 json 级别都尝试过。您能否添加更多详细信息? 这在使用 webpack 时不起作用 - 在这种情况下需要提供实际的库 - import from 'jasmine' 会推动库通过 这对我有用,但我还必须将我的全局打字稿升级到 3.5.3(从 2.5)【参考方案12】:

看看导入可能你有一个循环依赖,在我的情况下这是错误,使用import from 'jasmine';将修复控制台中的错误并使代码可编译但不删除根恶魔(在我的例子中是循环依赖)。

【讨论】:

【参考方案13】:
npm install @types/jasmine

正如某些 cmets 中提到的,不再需要 "types": ["jasmine"],所有 @types 包都会自动包含在编译中(我认为是 v2.1 起)。

在我看来,最简单的解决方案是排除 tsconfig.json 中的测试文件,例如:

"exclude": [
    "node_modules",
    "**/*.spec.ts"
]

这对我有用。

更多信息见官方tsconfig docs。

【讨论】:

请注意:新的 Angular 项目有 src/tsconfig.app.jsonsrc/tsconfig.spec.jsontsconfig.json。提到的“排除”部分是第一个部分的一部分。 "types": [ "jasmine" ] 第 2 部分。 请注意,在 VS Code 中,您无法在规范文件中查找引用,因为它们不会被视为项目的一部分。 @mleu 我面临同样的问题。你是如何解决这个问题的?每次编写测试用例时,我都必须从 exclude 块中删除规范文件模式。 @ShishirAnshuman:我没有找到解决方案,不得不忍受这个限制,直到项目结束。 @mleu 哦。没有任何问题。在我的项目中,作为一种解决方法,我从 tsconfig 的 exclude 块中删除了规范文件模式。然后我创建了一个新的tsconfig.build.json 文件,并将规范文件模式添加到exclude 块中。现在,在我的ts-loader 选项中(在 webpack.config 中)我使用的是tsconfig.build.json。使用这些配置,模块在测试文件中被解析,并且在创建构建或启动服务器时,测试文件被排除在外。【参考方案14】:

就我而言,解决方案是删除我的tsconfig.json 中的typeRoots

正如您在TypeScript doc 中看到的那样

如果指定了 typeRoots,则只包含 typeRoots 下的包。

【讨论】:

【参考方案15】:

使用 Typescript@2.0 或更高版本,您可以使用 npm install 安装类型

npm install --save-dev @types/jasmine

然后使用 tsconfig.json 中的 typeRoots 选项自动导入类型。

"typeRoots": [
      "node_modules/@types"
    ],

此解决方案不需要 import from 'jasmine';在每个规范文件中。

【讨论】:

不幸的是,这不起作用。它仍然显示规范文件中的错误【参考方案16】:

这个问题的解决方案与他的回答中的@Pace has written 有关。不过,它并不能解释一切,所以如果你不介意,我会自己写。

解决方案:

添加这一行:

///<reference path="./../../../typings/globals/jasmine/index.d.ts"/>

hero.spec.ts 文件开头的问题修复。路径指向typings 文件夹(存储所有类型)。

要安装类型,您需要在项目的根目录中创建 typings.json 文件,其中包含以下内容:


  "globalDependencies": 
    "core-js": "registry:dt/core-js#0.0.0+20160602141332",
    "jasmine": "registry:dt/jasmine#2.2.0+20160621224255",
    "node": "registry:dt/node#6.0.0+20160807145350"
  

然后运行 ​​typings install(其中 typings 是 NPM 包)。

【讨论】:

这是非标准的做法。默认 tslint 规则将阻止引用路径。使用 tsconfig 文件指向 node_modules

以上是关于Angular 2 单元测试:找不到名称“描述”的主要内容,如果未能解决你的问题,请参考以下文章

TS2304:在 Webpack / Angular 2 中找不到名称“描述”

将 Swiper 6 升级到 7 后,在单元测试(开玩笑)上找不到模块“swiper_angular”

带有自定义类型的角度单元测试给出了找不到命名空间

Angular 2:找不到名称“订阅”

Angular 和 Typescript:找不到名称 - 错误:找不到名称

angular2 找不到名称要求