我在关注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);
});
});
单元测试就像一个魅力。问题是:我看到一些错误,在教程中提到:
我们的编辑器和编译器可能会抱怨他们不知道它和期望是什么,因为他们缺少描述 Jasmine 的打字文件。我们现在可以忽略那些烦人的抱怨,因为它们是无害的。
他们确实忽略了它。尽管这些错误是无害的,但当我收到一堆错误时,它在我的输出控制台中看起来并不好。
我得到的示例:
找不到名称“描述”。找不到名称“它”。找不到名称“期望”。
我能做些什么来修复它?
我希望你已经安装 -
npm install --save-dev @types/jasmine
然后将以下导入放在 hero.spec.ts
文件的顶部 -
import 'jasmine';
它应该可以解决问题。
使用 Typescript@2.0 或更高版本,您可以安装类型:
npm install -D @types/jasmine
然后使用 tsconfig.json
中的 types
选项自动导入类型:
"types": ["jasmine"],
此解决方案不需要在每个规范文件中包含 import {} from 'jasmine';
。
"types": ["jasmine"]
行。 “默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的 node_modules/@types 中的包都被认为是可见的;具体来说,这意味着 ./node_modules/@types/、../node_modules/@ 中的包类型/、../../node_modules/@types/ 等等。”
node
和 jasmine
类型。至少它对我不起作用,我正在使用 Typescript@2.1.5
ang-app/e2e/tsconfig.json
中使用过。我在每个 json 级别都尝试过。您能否添加更多详细信息?
npm install @types/jasmine
正如一些评论中提到的,不再需要 "types": ["jasmine"]
,所有 @types
包都自动包含在编译中(我认为是 v2.1 起)。
在我看来,最简单的解决方案是排除 tsconfig.json 中的测试文件,例如:
"exclude": [
"node_modules",
"**/*.spec.ts"
]
这对我有用。
更多信息见官方tsconfig docs。
src/tsconfig.app.json
、src/tsconfig.spec.json
和 tsconfig.json
。提到的“排除”部分是第一个部分的一部分。 "types": [ "jasmine" ]
第 2 部分。
exclude
块中删除规范文件模式。
exclude
块中删除了规范文件模式。然后我创建了一个新的 tsconfig.build.json
文件,并将 spec 文件模式添加到 exclude
块中。现在,在我的 ts-loader
选项中(在 webpack.config 中),我使用的是 tsconfig.build.json
。使用这些配置,模块在测试文件中被解析,并且在创建构建或启动服务器时,测试文件被排除在外。
您需要为茉莉花安装类型。假设您使用的是相对较新的 typescript 2 版本,您应该能够:
npm install --save-dev @types/jasmine
使用 Typescript@2.0 或更高版本,您可以使用 npm install 安装类型
npm install --save-dev @types/jasmine
然后使用 tsconfig.json 中的 typeRoots 选项自动导入类型。
"typeRoots": [
"node_modules/@types"
],
此解决方案不需要 import {} from 'jasmine';在每个规范文件中。
这个问题的解决方案与他回答中的@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 包)。
就我而言,解决方案是删除我的 tsconfig.json
中的 typeRoots
。
正如您在 TypeScript doc 中所读到的
如果指定了 typeRoots,则仅包含 typeRoots 下的包。
为了使 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
。完全删除该选项后,它工作正常。
我到今天为止是最新的,发现解决此问题的最佳方法是什么都不做...不typeRoots
不types
不exclude
不include
所有默认值似乎都工作得很好.实际上,在我将它们全部删除之前,它并不适合我。我有:
"exclude": [
"node_modules"
]
但这是默认设置,所以我删除了它。
我有:
"types": [
"node"
]
克服一些编译器警告。但现在我也删除了它。
不应出现的警告是:来自 node_modules\@types\graphql\subscription\subscribe.d.ts
的 error TS2304: Cannot find name 'AsyncIterable'.
这非常令人讨厌,所以我在 tsconfig 中执行了此操作,以便加载它:
"compilerOptions": {
"target": "esnext",
}
因为它在 esnext 集中。我没有直接使用它,所以暂时不用担心兼容性。希望以后不要烧死我。
tsconfig.json
中添加 "types": ["node"]
,但您应该在 tsconfig.app.json
中添加此类型!我认为你不应该再收到这个警告。您现在可以保留 "target": "es5"
或 "target": "es6"
。
我将在 "typescript": "3.2.4" 中添加对我有用的答案
安装类型 jasmine npm install -D @types/jasmine
添加到 tsconfig.json jasmine/ts3.1 "typeRoots": [ ... "./node_modules/jasmine/ts3.1" ],
将 Jasmine 添加到类型 "types": [ "jasmine", "node" ],
注意:不再需要这个 import 'jasmine';
。
只需执行以下操作即可在存在多个 node_modules 的 Lerna Mono-repo 中获取 @types。
npm install -D @types/jasmine
然后在每个模块或应用程序的每个 tsconfig.file
"typeRoots": [
"node_modules/@types",
"../../node_modules/@types" <-- I added this line
],
就我而言,我在提供应用程序时遇到此错误,而不是在测试时。我没有意识到我的 tsconfig.app.json 文件中有不同的配置设置。
我以前有这个:
{
...
"include": [
"src/**/*.ts"
]
}
在提供应用程序时,它包括了我的所有 .spec.ts
文件。我更改了 include property to
exclude` 并添加了一个正则表达式来排除所有测试文件,如下所示:
{
...
"exclude": [
"**/*.spec.ts",
"**/__mocks__"
]
}
现在它按预期工作。
我在角度库中遇到了这个错误。结果我不小心将我的 .spec 文件包含在我的 public-api.ts 的导出中。删除导出解决了我的问题。
查看导入可能您有 循环依赖,在我的情况下这是错误,使用 import {} from 'jasmine';
将修复控制台中的错误并使代码可编译但不会删除魔鬼的根(在我的情况下,循环依赖)。
我在 Angular 6、Typescript 2.7 上,并且正在使用 Jest 框架进行单元测试。我在 tsconfig.json
内的 typeRoots
上安装并添加了 @types/jest
但仍然有下面的显示错误(即:在终端上没有错误)
找不到名称描述
并添加导入:
import {} from 'jest'; // in my case or jasmine if you're using jasmine
在技术上没有做任何事情,所以我想,有一个导入导致这个问题,然后我发现,如果删除文件
tsconfig.spec.json
在 src/
文件夹中,为我解决了问题。因为 @types 是在 rootTypes 之前导入的。
我建议你这样做并删除这个文件,里面不需要配置。 (ps:如果你和我一样的话)
如果错误在 .specs 文件 app/app.component.spec.ts(7,3) 中:错误 TS2304:找不到名称“beforeEach”。
将此添加到文件顶部并 npm install rxjs
从'rxjs'导入{范围};从'rxjs/operators'导入{地图,过滤器};
@types/jasmine@2.5.41
。否则您可能会看到 these compilation errors。import 'jasmine';
import {} from 'jasmine';
实际上是做什么的?和import 'jasmine'
一样吗?