Angular 2单元测试:找不到名称'describe'

Pio*_*rek 194 unit-testing jasmine typescript angular

我正在关注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);
  });
});
Run Code Online (Sandbox Code Playgroud)

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

我们的编辑器和编译器可能会抱怨他们不知道是什么it ,expect因为他们缺少描述Jasmine的打字文件.我们现在可以忽略那些烦人的抱怨,因为它们是无害的.

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

我得到的例子:

找不到名字'describe'.

找不到名字'它'.

找不到名字'期待'.

我该怎么办才能修复它?

ksh*_*fbd 363

我希望你已安装 -

hero.spec.ts

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

hero.spec.ts

它应该解决问题.

  • 你可以导入模块的副作用:`import'jamine';` (17认同)
  • 来自'jasmine'的`import {}是什么;`实际上是什么?它和`import'jamine'`是一样的吗? (8认同)
  • 根据所需的Typescript版本,您可能需要安装早期版本.例如,对于我目前正在使用的使用typescript v2.0.9的离子v2.2.1,我需要安装`@ types/jasmine @ 2.5.41`.否则,您可能会看到[这些编译错误](https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14569). (3认同)
  • 在Angular 6.0.3中:我刚刚导入了“从茉莉花导入{}},它再次起作用 (2认同)
  • @aesede您运行什么版本的PS?我只是执行了没有引号的命令,它运行得很好。 (2认同)

Jia*_* Hu 154

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

npm install -D @types/jasmine
Run Code Online (Sandbox Code Playgroud)

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

"types": ["jasmine"],
Run Code Online (Sandbox Code Playgroud)

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

  • @bholben我知道,但由于某种原因,没有检测到`node`和`jasmine`类型.至少它对我不起作用,我使用的是Typescript@2.1.5 (12认同)
  • 对于ts​​config.json的每个TypeScript文档(此时为v2.1),不再需要添加"类型":["jasmine"]`行."默认情况下,所有可见的"@types"包都包含在您的编译中.任何封闭文件夹的node_modules/@类型的包都被认为是可见的;具体来说,这意味着包含在./node_modules/@types/,../node_modules/@ types /,../../node_modules/@ type /,等等." (9认同)
  • 这个解决方案对我不起作用:(抱歉.我在`ang-app/e2e/tsconfig.json`中使用它.我在每个json级别尝试过它.你能否添加更多细节? (2认同)

len*_*nny 26

npm install @types/jasmine
Run Code Online (Sandbox Code Playgroud)

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

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

"exclude": [
    "node_modules",
    "**/*.spec.ts"
]
Run Code Online (Sandbox Code Playgroud)

这适合我.

官方tsconfig文档中的更多信息.

  • 只是注意:新的Angular项目有`src/tsconfig.app.json`,`src/tsconfig.spec.json`和`tsconfig.json`.提到的"排除"部分是第一部分.`"类型":["jasmine"]`第二部分. (3认同)
  • 请注意,在VS Code中,您将无法在规范文件中找到引用,因为它们不会被视为项目的一部分。 (2认同)

Pac*_*ace 13

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

__CODE__


mve*_*and 7

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

npm install --save-dev @types/jasmine
Run Code Online (Sandbox Code Playgroud)

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

"typeRoots": [
      "node_modules/@types"
    ],
Run Code Online (Sandbox Code Playgroud)

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


Ome*_*lan 6

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

当字段中存在一些types条目compilerOptions,但同时jest条目丢失时,就会出现此问题。

因此,为了解决问题,compilerOptions您的字段tscongfig.json应该包含jest在区域中或完全types删除: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"
  ]
}
Run Code Online (Sandbox Code Playgroud)