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


213

我正在从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因为它们缺少描述Jasmine的键入文件。我们现在可以忽略那些烦人的投诉,因为它们是无害的。

他们确实忽略了它。即使这些错误是无害的,当我收到很多错误时,在我的输出控制台中看起来也不是很好。

我得到的例子:

找不到名称“描述”。

找不到名称“它”。

找不到名称“期望”。

我该如何解决?


您可以在Github上投票
Lucas Cimon

Answers:


386

希望您已安装-

npm install --save-dev @types/jasmine

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

import 'jasmine';

它应该解决问题。


3
根据所需的Typescript版本,您可能需要安装早期版本。例如,对于我当前正在使用的打字机v2.0.9使用的ionic v2.2.1,我需要安装@types/jasmine@2.5.41。否则,您可能会看到这些编译错误
Tony O'Hagan

18
您可以仅导入其副作用的模块:import 'jasmine';
camolin3

8
什么是import {} from 'jasmine';真正做到?一样import 'jasmine'吗?
TetraDev

2
Angular 6.0.3:我刚刚从茉莉花中导入了“ import {}”,它再次起作用
Eduardo Cordeiro

2
@aesede您运行什么版本的PS?我只是执行了该命令而没有任何引号,它运行得很好。
康拉德·维特尔斯滕

162

使用Typescript@2.0或更高版本,您可以通过以下方式安装类型:

npm install -D @types/jasmine

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

"types": ["jasmine"],

该解决方案不需要import {} from 'jasmine';每个规格文件。


9
根据tsconfig.json的TypeScript文档(目前为v2.1),不再需要添加该"types": ["jasmine"]行。“默认情况下,所有可见的“ @types”软件包都包含在您的编译中。任何封闭文件夹的node_modules / @ types中的软件包都被视为可见;特别是,这意味着./node_modules/@types/,../node_modules/@中的软件包types /、../../ node_modules / @ types /等,”。
bholben '17

12
我知道@bholben,但是由于某些原因nodejasmine类型没有被检测到。至少它不为我工作,我使用Typescript@2.1.5
佳艺胡锦涛

2
该解决方案对我不起作用:(,对不起。我在.json中使用过它ang-app/e2e/tsconfig.json我在每个json级别都尝试过它。能否请您添加更多详细信息?
Sergii 2017年

使用webpack时不起作用-在这种情况下,需要提供实际的库-'jasmine'的import {}将库推入
Bogdan

这对我
有用

27
npm install @types/jasmine

正如一些评论中所提到的,"types": ["jasmine"]不再需要这些@types软件包,所有软件包都自动包含在编译中(我认为从v2.1开始)。

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

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

这对我有用。

tsconfig官方文档中的更多信息。


3
只是记:新的角度项目有src/tsconfig.app.jsonsrc/tsconfig.spec.jsontsconfig.json。提到的“排除”部分是第一部分的一部分。"types": [ "jasmine" ]第二部分。
Martin Schneider

2
请注意,在VS Code中,您将无法在规范文件中找到引用,因为它们不会被视为项目的一部分。
mleu

@mleu我正面临着同样的问题。您如何解决此问题?每次编写测试用例时,我都必须从exclude块中删除spec文件模式。
Shishir Anshuman

@ShishirAnshuman:我没有找到解决方案,不得不忍受这个限制,直到项目结束。
mleu

@mleu哦。没有任何问题。作为解决方法,在我的项目中,我从tsconfig的exclude块中删除了规范文件模式。然后,我创建了一个新tsconfig.build.json文件,并将规范文件模式添加到了该exclude块中。现在,在我的ts-loader选项(在webpack.config中)中,我正在使用tsconfig.build.json。通过这些配置,将在测试文件中解析模块,并且在创建内部版本或启动服务器时,将排除测试文件。
Shishir Anshuman

13

您需要安装茉莉花的类型。假设您使用的是相对较新的打字稿2版本,则应该可以执行以下操作:

npm install --save-dev @types/jasmine

8

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

npm install --save-dev @types/jasmine

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

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

此解决方案不需要从'jasmine'导入{};在每个规格文件中。


1
不幸的是,这不起作用。它仍然显示规范文件中的错误
dave0688 '18

3

该问题的解决方案与@Pace在其答案中写的内容有关。但是,它并不能说明所有问题,如果您不介意,我会自己写。

解:

添加此行:

///<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 installtypingsNPM软件包在哪里)。


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

3

在我的情况下,解决办法是删除typeRoots在我tsconfig.json

如您在TypeScript文档中所

如果指定了typeRoots,则仅包含typeRoots下的软件包。


3

我掌握了最新的信息,发现解决此问题的最佳方法是什么也不做... typeRoots不,types不,exclude不,include所有默认设置似乎都可以正常工作。实际上,直到我将它们全部删除,它才对我不起作用。我有:

"exclude": [
    "node_modules"
]

但这是默认设置,因此我将其删除。

我有:

"types": [
    "node"
]

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

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

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

"compilerOptions": {
    "target": "esnext",
}

因为它在esnext集中。我没有直接使用它,因此在此无需担心兼容性。希望以后不会烧死我。


您无需添加"types": ["node"]tsconfig.json但您应该在中添加此类型tsconfig.app.json!我认为您不应再有此警告。您可以保留"target": "es5"还是"target": "es6"现在。
Christophe Chevalier

2

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

npm install -D @types/jasmine

然后在每个模块或应用程序的每个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/等内的软件包。参见官方文档
Christophe Chevalier,

1

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

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

因此,为了解决该问题,compilerOptions您的字段tscongfig.json应该包含jesttypes区域中或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"
  ]
}

这为我工作,我google map typestypes选项。完全删除该选项后,它可以正常工作。
pritesh agrawal

1

我将在“打字稿”中添加对我有用的答案:“ 3.2.4”我意识到在node_modules / @ types中的茉莉花在茉莉花类型下有一个ts3.1的文件夹,因此,这些步骤是:

  • 安装类型茉莉花 npm install -D @types/jasmine
  • 添加到tsconfig.json茉莉花/ts3.1

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

  • 将茉莉花添加到类型

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

注意:不再需要此功能import 'jasmine';


1

就我而言,在提供应用程序时(而非测试时)出现此错误。我没有意识到我在tsconfig.app.json文件中有不同的配置设置。

我以前有这个:

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

.spec.ts服务该应用程序时包括我的所有文件。我更改了include property toexclude`并添加了正则表达式以排除所有测试文件,如下所示:

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

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


0

看一下导入,也许您有一个循环依赖关系,在我的情况下,这是错误,使用import {} from 'jasmine';可以修复控制台中的错误并使代码可编译,但不能删除魔鬼的根(在我的情况下为循环依赖关系)。


0

我正在使用Angular 6,Typescript 2.7,并且正在使用Jest框架进行单元测试。我已经@types/jest安装并添加到typeRoots里面tsconfig.json

但是下面仍然显示错误(即:在终端上没有错误)

找不到名字描述

并添加导入:

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

从技术上讲并没有做任何事情,所以我认为在某处导入会导致此问题,然后我发现,如果删除文件

tsconfig.spec.json

在里面 src/文件夹中,为我解决了问题。由于@types是在rootTypes之前导入的。

我建议您执行相同的操作并删除此文件,因为其中没有所需的配置。(ps:如果您与我同属一种情况)


0

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

将此添加到文件顶部,然后npm install rxjs

从'rxjs'导入{range}; 从'rxjs / operators'导入{map,filter};

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.