角度2单元测试:找不到名称'描述'

时间:2016-08-18 13:51:47

标签: unit-testing angular typescript jasmine

我跟随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);
  });
});

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

  

我们的编辑和编译器可能会抱怨他们不知道it   和expect是因为他们缺少描述的输入文件   茉莉花。我们现在可以忽略那些烦人的抱怨   无害。

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

我得到的例子:

  

找不到姓名'描述'。

     

找不到名字'它'。

     

找不到姓名'期待'。

我该怎么做才能解决它?

15 个答案:

答案 0 :(得分:350)

我希望你已经安装了 -

npm install --save-dev @types/jasmine

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

import 'jasmine';

它应该解决问题。

答案 1 :(得分:142)

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

npm install -D @types/jasmine

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

"types": ["jasmine"],

此解决方案在每个spec文件中不需要import {} from 'jasmine';

答案 2 :(得分:24)

npm install @types/jasmine

如某些评论所述,不再需要"types": ["jasmine"],所有@types包都会自动包含在编译中(因为我认为是v2.1)。

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

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

这适合我。

官方tsconfig docs中的更多信息。

答案 3 :(得分:13)

您需要为茉莉花安装打字。假设您使用的是相对较新版本的typescript 2,您应该能够:

npm install --save-dev @types/jasmine

答案 4 :(得分:7)

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

安装类型
npm install --save-dev @types/jasmine

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

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

此解决方案不需要来自'jasmine'的import {};在每个spec文件中。

答案 5 :(得分:3)

此问题的解决方案与答案中的@Pace has written有关。但是,它并没有解释所有内容,所以,如果你不介意,我会自己写。

<强> SOLUTION:

添加以下行:

///<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包)。

答案 6 :(得分:3)

我已达到今天的最新状态,并发现解决此问题的最佳方法是不做任何事......不typeRootstypesexclude否{{1所有默认值似乎都正常工作。实际上,除非将它们全部删除,否则它不适合我。我有:

include

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

我有:

"exclude": [
    "node_modules"
]

通过一些编译器警告。但现在我也将其删除了。

不应该的警告是: "types": [ "node" ] 来自error TS2304: Cannot find name 'AsyncIterable'.

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

node_modules\@types\graphql\subscription\subscribe.d.ts

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

答案 7 :(得分:3)

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

您可以阅读TypeScript doc

  

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

答案 8 :(得分:1)

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

npm install -D @types/jasmine

然后在每个模块或应用程序的每个tsconfig.file中

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

答案 9 :(得分:0)

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

答案 10 :(得分: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:如果您和我的情况相同)

答案 11 :(得分:0)

为使TypeScript编译器在编译期间使用所有可见的类型定义,应从root brands brand_0 //created with .childByAutoId brand: "7 days" product_0: true //products should probably be in a child node product_1: true brand_1 brand: "Zomo" product_0: true product_1: true all_products product_0 name: "Tabak1" brand_0: true brand_1: true product_1 name: "Tabak2" brand_0: true brand_1: true 文件的types字段中完全删除compilerOptions选项。

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

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

types

答案 12 :(得分:0)

我将在“打字稿”中添加对我有用的答案:“ 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';

答案 13 :(得分:0)

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

我以前有这个:

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

在提供该应用程序时,它包括了我所有的.spec.ts文件。我更改了include property to exclude`并添加了一个正则表达式以排除所有这样的测试文件:

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

现在它可以正常工作了。

答案 14 :(得分:0)

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

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

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