2016-08-18 118 views
108

我下面this tutorial from angular.io角2单元测试:找不到名称“描述”

正如他们所说,我创建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是因为他们缺乏描述 茉莉花打字文件。我们现在可以忽略那些烦人的投诉,因为它们是无害的。

而且他们确实忽略了它。即使这些错误是无害的,当我收到一堆错误时,它在我的输出控制台中看起来不太好。是我所得到

例子:

找不到名称 '描述'。

找不到'it'这个名字。

找不到'expect'的名字。

我该怎么办才能修复它?

+0

你可以在Github上来修复这个bug:https://github.com/TypeStrong/atom-typescript/issues/1125 –

回答

231

我希望你已经安装 -

npm install --save-dev @types/jasmine

然后把下面的导入在hero.spec.ts文件的顶部 -

import {} from 'jasmine';

应该解决的问题。

+0

如果在Windows PowerShell中,您必须执行'npm install --save-dev'@ types/jasmine“'(注意双引号)或将引发错误 – aesede

+3

根据Typescript的版本要求您可能需要安装较早的版本。例如对于我目前使用的离子v2.2.1使用的是typescript v2.0.9,我需要安装'@ types/jasmine @ 2.5.41'。否则,你可能会看到[这些编译错误](https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14569)。 –

+8

你可以为它的副作用导入模块:'import'jasmine';' – camolin3

10

你需要安装茉莉花的打字。假设你是一个相对较新的版本打字稿2,你应该能够做到:

npm install --save-dev @types/jasmine

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

+2

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

95

使用[email protected]或更高版本,您可以使用npm install @types/jasmine安装类型,然后使用tsconfig.json中的types选项自动导入类型。

"types": ["jasmine"], 

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

+4

,它不需要添加'“类型”:[“jasmine”]'线了。 “默认情况下,所有可见的”@types“包都包含在编译中,任何包含文件夹的node_modules/@类中的包都被视为可见的;具体来说,这意味着./node_modules/@types/,../node_modules/@类型/,../../node_modules/@types/,等等。“ – bholben

+4

@bholben我知道,但由于某种原因'节点'和'茉莉花'类型没有检测到。至少它不适用于我,我正在使用[email protected] –

+2

该解决方案对我来说不起作用:(对不起,我在'ang-app/e2e/tsconfig.json'中使用了它。它在每一个json level_。你可以请添加更多的细节? – Sergii

13
npm install @types/jasmine 

正如一些评论已经不再需要了"types": ["jasmine"]提到的,所有@types包自动包含在汇编(自V2.1我认为)。

在我看来,最简单的方法是排除在tsconfig.json像测试文件:

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

这对我的作品。

官方tsconfig docs的更多信息。

+3

推动库仅仅是一个提示:新的Angular项目有'src/tsconfig.app.json','src/tsconfig.spec.json'和'tsconfig.json'。提到的“排除”部分是第一部分的一部分''types“:[”jasmine“]'第二部分 –

+0

这对我没有用 – fidev

+0

请注意,在VS代码中你失去了查找引用的能力您的规格文件,因为它们不会被视为项目的一部分。 – mleu

2

随着[email protected]或更高版本可以安装类型与故宫安装

npm install --save-dev @types/jasmine 

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

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

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

1

我到最新的今天,发现,解决它的最好方法是什么也不做......没有typeRoots没有types没有exclude没有include所有默认设置似乎工作得很好。事实上,直到我将它们全部删除后,它才适用于我。我有: "exclude": [ "node_modules" ] 但这是在默认情况下,所以我删除了。

我得到了: "types": [ "node" ] 得到过去一些编译器警告。但现在我也删除了。

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

这是非常讨厌,所以我做这tsconfig以便它加载它: "compilerOptions": { "target": "esnext", } ,因为它是在esnext集。我没有直接使用它,所以不用担心兼容性问题。希望以后不要烧我。

2

在我的情况下,解决方案是删除我的tsconfig.json中的typeRoots

正如你可以在TypeScript doc

如果指定typeRoots读取,只能在typeRoots软件包将被包括在内。

0

看进口也许你有一个循环依赖,这是在我的情况的错误,使用import {} from 'jasmine';将修复控制台中的错误,并进行代码编译,但没有消除恶魔的根源(以我的案例循环依赖)。