Angular 2 Unit Tests:名前「describe」が見つかりません


213

私は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);
  });
});

単体テストは魅力のように機能します。問題は、チュートリアルで言及されているいくつかのエラーが表示されることです。

私たちのエディタとコンパイラのは、彼らが何を知っていないと文句を言うことitexpect、彼らはジャスミンを記述タイピングファイルを欠いているためです。それらは無害なので、今のところそれらの迷惑な苦情は無視できます。

そして彼らは実際にそれを無視した。これらのエラーは無害ですが、大量のエラーを受け取った場合、出力コンソールでは見栄えがよくありません。

私が得るものの例:

「説明」という名前が見つかりません。

「it」という名前が見つかりません。

名前「expect」が見つかりません。

どうすれば修正できますか?


回答:


386

あなたがインストールしたことを願っています-

npm install --save-dev @types/jasmine

次に、次のインポートをhero.spec.tsファイルの先頭に配置します-

import 'jasmine';

問題を解決するはずです。


3
必要なTypescriptのバージョンによっては、以前のバージョンをインストールする必要がある場合があります。たとえば、typescript v2.0.9を使用する現在使用しているionic v2.2.1の場合、をインストールする必要がありました@types/jasmine@2.5.41。そうしないと、これらのコンパイルエラーが発生する可能性があります。
トニーO'Hagan

18
あなたはその副作用のためにモジュールをインポートすることができます:import 'jasmine';
camolin3

8
import {} from 'jasmine';実際には何をしますか?それは同じimport 'jasmine'ですか?
TetraDev 2017

2
ANGULAR 6.0.3:「ジャスミンからのインポート{}」をインポートしたところ、再び機能しました
Eduardo Cordeiro

2
@aesedeどのバージョンのPSを実行していますか?引用符なしでコマンドを実行したところ、うまくいきました。
Konrad Viltersten、

162

Typescript@2.0以降では、次を使用してタイプをインストールできます。

npm install -D @types/jasmine

次に、次のtypesオプションを使用してタイプを自動的にインポートしますtsconfig.json

"types": ["jasmine"],

このソリューションはimport {} from 'jasmine';、各スペックファイルに必要ではありません。


9
tsconfig.json(現時点ではv2.1)のTypeScriptドキュメントごとに、この"types": ["jasmine"]行を追加する必要はありません。「デフォルトでは、すべての表示可能な「@types」パッケージがコンパイルに含まれています。包含フォルダーのnode_modules / @ types内のパッケージは表示可能と見なされます。具体的には、。/ node_modules / @ types /、../node_modules/@内のパッケージを意味しますタイプ/、../../node_modules/@types/など。」
bholben 2017

12
@bholben知っていますが、何らかの理由nodejasmineタイプが検出されません。少なくとも私にとっては機能せず、Typescript @ 2.1.5を使用しています
Jiayi Hu

2
このソリューションは私にとっては機能しません:(、申し訳ありません。私はで使用しましたang-app/e2e/tsconfig.jsonすべてのjsonレベルで試してみました。 詳細を追加
セルギ

これは、webpackを使用する場合は機能しません-この場合、実際のライブラリを提供する必要があります-'jasmine'からのインポート{}がライブラリをプッシュします
Bogdan

(2.5から)これは私のために働いたが、私はまた、3.5.3に私のグローバルtypescriptですをアップグレードする必要がありました
jsaddwater

27
npm install @types/jasmine

一部のコメントで述べたように、これ"types": ["jasmine"]はもう必要ありません。すべての@typesパッケージが自動的にコンパイルに含まれます(v2.1以降)

私の意見では、最も簡単な解決策は、次のようにtsconfig.jsonのテストファイルを除外することです。

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

これは私にとってはうまくいきます。

公式のtsconfig docsの詳細情報。


3
ちょうど注記:新しい角度のプロジェクトが持っているsrc/tsconfig.app.jsonsrc/tsconfig.spec.jsontsconfig.json。上記の「除外」セクションは、最初のセクションの一部です。"types": [ "jasmine" ]2番目の一部。
Martin Schneider

2
VSコードでは、プロジェクトの一部とは見なされないため、スペックファイル内の参照を検索できなくなります。
mleu 2017

@mleu同じ問題に直面しています。この問題をどのように修正しましたか?テストケースを作成するたびに、スペックファイルのパターンをexcludeブロックから削除する必要があります。
Shishir Anshuman

@ShishirAnshuman:私は解決策を見つけられなかったので、プロジェクトが終了するまでこの制限を守らなければなりませんでした。
mleu 2018年

@mleuああ。問題ない。回避策としての私のプロジェクトでは、tsconfigのexcludeブロックからspecファイルのパターンを削除しました。次にtsconfig.build.json、specファイルパターンがexcludeブロックに追加された新しいファイルを作成しました。今、私のts-loaderオプション(webpack.config内)でを使用していtsconfig.build.jsonます。これらの構成では、モジュールはテストファイルで解決され、ビルドの作成中またはサーバーの起動中、テストファイルは除外されます。
Shishir Anshuman

13

ジャスミンのタイピングをインストールする必要があります。あなたがtypescript 2の比較的最近のバージョンを使っていると仮定すると、あなたはできるはずです:

npm install --save-dev @types/jasmine

8

Typescript@2.0以降では、npm installでタイプをインストールできます

npm install --save-dev @types/jasmine

次に、tsconfig.jsonのtypeRootsオプションを使用してタイプを自動的にインポートします。

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

このソリューションでは、「jasmine」からのインポート{}は必要ありません。各スペックファイル内。


1
残念ながらそれはうまくいきません。スペックファイルのエラーは引き続き表示されます
dave0688

3

この問題の解決策は、@ Paceが彼の回答に書いたものと関連しています。ただし、すべてを説明しているわけではないので、よろしければ自分で書いてみます。

解決:

この行を追加します。

///<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 installtypingsNPMパッケージはどこにありますか)。


3
これはこれを行う非標準的な方法です。デフォルトのtslintルールは、参照パスを防ぎます。tsconfigファイルを使用してnode_modulesを指す
FlavorScape

3

私の場合、解決策はのを削除するtypeRootsことtsconfig.jsonでした。

TypeScriptドキュメントで読むことができるように

typeRootsが指定されている場合、typeRootsの下のパッケージのみが含まれます。


3

私は今日の最新の状態にあり、これを解決する最善の方法は何もしないことです... 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セットに含まれているためです。私は直接使用していないので、互換性についてはまだ心配していません。それが後で私を焦がさないことを願っています。


あなたは追加する必要はありません"types": ["node"]tsconfig.jsonいますが、このタイプを追加する必要がありますtsconfig.app.json!もうこの警告は出すべきではないと思います。そのまま"target": "es5"でもいいし、"target": "es6"今でもいい。
クリストフシュバリエ

2

いくつかのnode_modulesが存在するLerna Mono-repoで@typesを取得するために必要なことは、次のことだけです。

npm install -D @types/jasmine

次に、各モジュールまたはアプリの各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 /内のパッケージなどを意味します。公式ドキュメントを
クリストフシュヴァリエ

1

TypeScriptコンパイラーがコンパイル時にすべての可視の型定義を使用するためには、ファイルのフィールドtypesからオプションを完全に削除する必要があります。compilerOptionstsconfig.json

この問題はtypescompilerOptionsフィールドにいくつかのエントリが存在し、同時にjestエントリが欠落している場合に発生します。

だから、問題を解決するために、compilerOptionsあなたのフィールドには、tscongfig.jsonいずれか含むべきjesttypes面積または取り除くtypescomnpletely:

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

これは私にとってはうまくいきました、私google map typesにはtypesオプションがありました。オプションを完全に削除すると、問題なく動作しました。
pritesh agrawal

1

「typescript」で私のために機能するものの答えを追加するだけです:「3.2.4」私はnode_modules / @ typesのjasmineにts3.1のフォルダーがjasmineタイプの下にあることに気付いたので、ここに手順があります-

  • インストールタイプジャスミン npm install -D @types/jasmine
  • tsconfig.jsonに追加jasmine / ts3.1

    "typeRoots": [ ... "./node_modules/jasmine/ts3.1" ],

  • ジャスミンをタイプに追加する

    "types": [ "jasmine", "node" ],

注:これはimport 'jasmine';もう必要ありません。


1

私の場合、テストではなくアプリを提供するときにこのエラーが発生しました。tsconfig.app.jsonファイルに別の構成設定があることに気付きませんでした。

私は以前これを持っていました:

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

.spec.tsアプリを提供するときに、すべてのファイルが含まれていました。include property toexclude` を変更し、次のようにすべてのテストファイルを除外する正規表現を追加しました。

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

これで期待どおりに動作します。


0

インポートを見ると、おそらくサイクル依存関係があります。これは私の場合のエラーでした。使用import {} from 'jasmine';すると、コンソールのエラーが修正され、コードがコンパイル可能になりますが、悪魔のルートは削除されません(私の場合はサイクル依存関係)。


0

私は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:私と同じケースの場合)


0

エラーが.specsファイルにある場合app / app.component.spec.ts(7,3):エラーTS2304:名前「beforeEach」が見つかりません。

これをファイルの先頭に追加し、npm install rxjs

'rxjs'から{range}をインポートします。'rxjs / operators'から{map、filter}をインポートします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.