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

单元测试工作起来很有魅力。问题是:我看到了一些错误,在教程中提到过:

我们的编辑和编译器可能会抱怨他们不知道它是什么 和期望,因为他们缺乏打字文件描述 茉莉花。我们可以暂时忽略那些恼人的抱怨 无害的。

他们确实忽略了这一点。尽管这些错误是无害的,但当我收到一堆错误时,在输出控制台中看起来并不好。

我得到的例子是:

无法找到名称“describe”。 找不到名字“it”。 找不到名称“expect”。

我能做些什么来弥补呢?


当前回答

在我的情况下,我得到这个错误时,我提供应用程序,而不是测试时。我没有意识到我在tsconfig.app.json文件中有不同的配置设置。

我之前有这个:

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

它包含了我所有的。spec。我将include属性改为exclude ',并添加了一个regex来排除所有测试文件,如下所示:

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

现在它按预期工作了。

其他回答

npm install @types/jasmine

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

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

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

这对我很有用。

更多信息请参阅官方tsconfig文档。

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

当compilerOptions字段中存在一些类型条目时,这个问题就会出现,而与此同时,笑话条目却缺失了。

所以为了解决这个问题,在你的tsconfig中输入compilerOptions字段。Json应该在类型区域中包含jest,或者完全摆脱类型:

{
  "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"
  ]
}

我使用的是Angular 6, Typescript 2.7,我使用Jest框架进行单元测试。 我已经安装了@types/jest,并添加在tsconfig.json中的typeRoots上

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

无法找到名称描述

并添加导入:

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

技术上没有做任何事情,所以我想,有一个导入的地方导致这个问题,然后我发现,如果删除文件

tsconfig.spec.json

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

我建议你做同样的事情,删除这个文件,没有必要的配置是在里面。(注:如果你和我有同样的情况)

只需要做以下事情来在Lerna Mono-repo中获取@types 其中存在几个node_module。

npm install -D @types/jasmine

然后在每个tsconfig中。每个模块或应用程序的文件

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

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