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);
);
);
单元测试就像一个魅力。问题是:我看到一些错误,教程中提到了:
我们的编辑器和编译器可能会抱怨他们不知道
it
和expect
是因为它们缺少描述的打字文件 茉莉花。我们可以暂时忽略那些烦人的抱怨 无害。
他们确实忽略了它。尽管这些错误是无害的,但当我收到一堆错误时,它在我的输出控制台中看起来并不好。
我得到的示例:
找不到名称“描述”。
找不到名称“它”。
找不到名字'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 to
exclude` 并添加了一个正则表达式来排除所有测试文件,如下所示:
...
"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】:我到今天为止是最新的,发现解决这个问题的最佳方法是什么都不做...不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 集中。我没有直接使用它,所以暂时不用担心兼容性。希望以后不会烧到我。
【讨论】:
您不需要在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
并添加到typeRoots
内tsconfig.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 我知道,但由于某种原因,node
和 jasmine
类型未被检测到。至少它对我不起作用,我正在使用 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.json
、src/tsconfig.spec.json
和 tsconfig.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”