Angular 2 Unit Tests: Name 'beschreiben' kann nicht gefunden werden


213

Ich folge diesem Tutorial von angle.io

Wie gesagt, ich habe die Datei hero.spec.ts erstellt, um Komponententests zu erstellen:

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

Unit Tests wirken wie ein Zauber. Das Problem ist: Ich sehe einige Fehler, die im Tutorial erwähnt werden:

Unser Editor und der Compiler beschweren sich möglicherweise, dass sie nicht wissen, was it und expectsind, weil ihnen die Typisierungsdateien fehlen, die Jasmine beschreiben. Wir können diese nervigen Beschwerden vorerst ignorieren, da sie harmlos sind.

Und sie haben es tatsächlich ignoriert. Obwohl diese Fehler harmlos sind, sieht es in meiner Ausgabekonsole nicht gut aus, wenn ich einige davon erhalte.

Beispiel für das, was ich bekomme:

Name 'beschreiben' kann nicht gefunden werden.

Der Name 'it' wurde nicht gefunden.

Der Name 'erwarten' kann nicht gefunden werden.

Was kann ich tun, um das Problem zu beheben?


Sie können auf Github upvoten, um diesen Fehler zu beheben: github.com/TypeStrong/atom-typescript/issues/1125
Lucas Cimon

Antworten:


386

Ich hoffe du hast installiert -

npm install --save-dev @types/jasmine

Fügen Sie dann den folgenden Import oben in die hero.spec.tsDatei ein -

import 'jasmine';

Es sollte das Problem lösen.


3
Abhängig von der erforderlichen Version von Typescript müssen Sie möglicherweise eine frühere Version installieren. zB Für ionic v2.2.1, das ich derzeit verwende und das Typoskript v2.0.9 verwendet, musste ich installieren @types/jasmine@2.5.41. Andernfalls werden diese Kompilierungsfehler möglicherweise angezeigt .
Tony O'Hagan

18
Sie können das Modul einfach wegen seiner Nebenwirkungen importieren:import 'jasmine';
camolin3

8
Was macht import {} from 'jasmine';eigentlich? Ist es das gleiche wie import 'jasmine'?
TetraDev

2
IN ANGULAR 6.0.3: Ich habe gerade "import {} from jasmine" importiert und es hat wieder funktioniert
Eduardo Cordeiro

2
@aesede Welche PS-Version verwenden Sie? Ich habe gerade den Befehl ohne Anführungszeichen ausgeführt und es lief einfach gut.
Konrad Viltersten

162

Mit Typescript@2.0 oder höher können Sie Typen installieren mit:

npm install -D @types/jasmine

Importieren Sie dann die Typen automatisch mit der typesOption in tsconfig.json:

"types": ["jasmine"],

Diese Lösung erfordert nicht import {} from 'jasmine'; in jeder Spezifikationsdatei.


9
Gemäß TypeScript-Dokumenten für tsconfig.json (derzeit v2.1) muss die "types": ["jasmine"]Zeile nicht mehr hinzugefügt werden. "Standardmäßig sind alle sichtbaren" @ types "-Pakete in Ihrer Kompilierung enthalten. Pakete in node_modules / @ -Typen eines umschließenden Ordners werden als sichtbar betrachtet. Dies bedeutet insbesondere, dass Pakete in ./node_modules/@types/, ../node_modules/@ types /, ../../node_modules/@types/ und so weiter. "
Bholben

12
@bholben Ich weiß, aber aus irgendeinem Grund nodeund jasmineTypen werden nicht erkannt. Zumindest funktioniert es nicht für mich und ich benutze Typescript@2.1.5
Jiayi Hu

2
Diese Lösung funktioniert bei mir nicht :(, sorry. Ich habe sie verwendet ang-app/e2e/tsconfig.json. Ich habe sie in jedem JSON-Level ausprobiert . Könnten Sie bitte weitere Details hinzufügen?
Sergii

Dies würde bei Verwendung von Webpack nicht funktionieren - in diesem Fall muss die eigentliche Bibliothek bedient werden - der Import {} aus 'Jasmin' schiebt die Bibliothek durch
Bogdan

Dies funktionierte für mich, aber ich musste auch mein globales Typoskript auf 3.5.3 (von 2.5)
aktualisieren

27
npm install @types/jasmine

Wie in einigen Kommentaren erwähnt, wird das "types": ["jasmine"]nicht mehr benötigt, alle @typesPakete werden automatisch in die Kompilierung einbezogen (seit v2.1 denke ich).

Meiner Meinung nach besteht die einfachste Lösung darin, die Testdateien in Ihrer tsconfig.json wie folgt auszuschließen :

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

Das funktioniert bei mir.

Weitere Informationen in den offiziellen tsconfig-Dokumenten .


3
Nur eine Anmerkung: neue Angular Projekte haben src/tsconfig.app.json, src/tsconfig.spec.jsonund tsconfig.json. Der erwähnte Abschnitt "Ausschließen" ist Teil des ersten. "types": [ "jasmine" ]Teil des 2 ..
Martin Schneider

2
Beachten Sie, dass Sie in VS Code nicht mehr in der Lage sind, Referenzen in Ihren Spezifikationsdateien zu finden, da diese nicht als Teil des Projekts betrachtet werden.
Mleu

@mleu Ich stehe vor dem gleichen Problem. Wie haben Sie dieses Problem behoben? Jedes Mal, wenn ich den Testfall schreibe, muss ich das Muster der Spezifikationsdateien aus dem excludeBlock entfernen .
Shishir Anshuman

@ShishirAnshuman: Ich habe keine Lösung gefunden und musste mit dieser Einschränkung leben, bis das Projekt endete.
Mleu

@leu Oh. Kein Problem. Als Problemumgehung habe ich in meinem Projekt das Muster der Spezifikationsdatei aus dem excludeBlock von tsconfig entfernt . Dann habe ich eine neue tsconfig.build.jsonDatei mit dem dem excludeBlock hinzugefügten Muster der Spezifikationsdatei erstellt . Jetzt verwende ich in meinen ts-loaderOptionen (in der webpack.config) tsconfig.build.json. Bei diesen Konfigurationen werden die Module in den Testdateien aufgelöst, und beim Erstellen des Builds oder Starten des Servers werden die Testdateien ausgeschlossen.
Shishir Anshuman

13

Sie müssen Typisierungen für Jasmin installieren. Angenommen, Sie befinden sich in einer relativ neuen Version von Typoskript 2, sollten Sie in der Lage sein:

npm install --save-dev @types/jasmine

8

Mit Typescript@2.0 oder höher können Sie Typen mit npm install installieren

npm install --save-dev @types/jasmine

importiert dann die Typen automatisch die Verwendung typeRoots Option in tsconfig.json.

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

Diese Lösung erfordert keinen Import {} von 'Jasmin'; in jeder Spezifikationsdatei.


1
Das funktioniert leider nicht. Es zeigt immer noch die Fehler in den Spezifikationsdateien
dave0688

3

Die Lösung für dieses Problem hängt mit dem zusammen, was @Pace geschrieben hat in seiner Antwort geschrieben hat. Es erklärt jedoch nicht alles. Wenn es Ihnen nichts ausmacht, schreibe ich es selbst.

LÖSUNG:

Hinzufügen dieser Zeile:

///<reference path="./../../../typings/globals/jasmine/index.d.ts"/>

am Anfang der hero.spec.tsDatei behebt das Problem. Weg führt zutypings Ordner (in dem alle Eingaben gespeichert sind).

Um Typisierungen zu installieren, müssen Sie eine typings.jsonDatei im Stammverzeichnis Ihres Projekts mit folgendem Inhalt erstellen :

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

Und ausführen typings install(wo typingsist das NPM-Paket).


3
Dies ist eine nicht standardmäßige Methode. Standard-tslint-Regeln verhindern Referenzpfade. Verwenden Sie die Datei tsconfig, um auf node_modules
FlavorScape

3

In meinem Fall bestand die Lösung darin, das typeRootsin meinem zu entfernen tsconfig.json.

Wie Sie im TypeScript-Dokument lesen können

Wenn typeRoots angegeben ist, werden nur Pakete unter typeRoots eingeschlossen.


3

Ich bin auf dem neuesten Stand von heute und habe den besten Weg gefunden, dies zu beheben, indem ich nichts tue ... nein typeRootsnein typesnein excludenein includealle Standardeinstellungen scheinen einwandfrei zu funktionieren. Eigentlich hat es bei mir nicht richtig funktioniert, bis ich sie alle entfernt habe. Ich hatte:

"exclude": [
    "node_modules"
]

aber das ist in den Standardeinstellungen, also habe ich das entfernt.

Ich hatte:

"types": [
    "node"
]

um eine Compiler-Warnung zu überwinden. Aber jetzt habe ich das auch entfernt.

Die Warnung, die nicht sein sollte, ist: error TS2304: Cannot find name 'AsyncIterable'. vonnode_modules\@types\graphql\subscription\subscribe.d.ts

Das ist sehr widerlich, also habe ich das in tsconfig gemacht, damit es geladen wird:

"compilerOptions": {
    "target": "esnext",
}

da es im esnext set ist. Ich benutze es nicht direkt, also mache ich mir hier noch keine Sorgen um die Kompatibilität. Hoffe das verbrennt mich später nicht.


Sie brauchen nicht hinzuzufügen , "types": ["node"]in , tsconfig.jsonaber Sie sollten diese Art in hinzufügen tsconfig.app.json! Sie sollten diese Warnung nicht noch einmal haben, denke ich. Du könntest behalten "target": "es5"oder "target": "es6"jetzt.
Christophe Chevalier

2

Musste nur Folgendes tun, um @types in einem Lerna Mono-Repo aufzunehmen, in dem mehrere node_modules existieren.

npm install -D @types/jasmine

Dann in jeder tsconfig.file jedes Moduls oder jeder App

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

Standardmäßig sind alle sichtbaren "@types" -Pakete in Ihrer Zusammenstellung enthalten. Pakete in den Typen node_modules / @ eines umschließenden Ordners werden als sichtbar betrachtet. Dies bedeutet insbesondere Pakete innerhalb von ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ usw. Siehe offizielle Dokumentation
Christophe Chevalier

1

Damit TypeScript Compiler während der Kompilierung alle sichtbaren Typdefinitionen verwenden kann, typessollte die Option vollständig aus dem compilerOptionsFeld in entfernt werdentsconfig.json Datei entfernt werden.

Dieses Problem tritt auf, wenn einige typesEinträge im compilerOptionsFeld vorhanden sind, in denen gleichzeitig ein jestEintrag fehlt.

Um das Problem zu beheben, sollte das compilerOptionsFeld in Ihrem Feld tscongfig.jsonentweder jestin den typesBereich aufgenommen oder typesvollständig entfernt werden:

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

Das hat bei mir geklappt, ich hatte google map typesdie typesOption. Nachdem die Option vollständig entfernt wurde, funktionierte sie einwandfrei.
Pritesh Agrawal

1

Ich füge nur Antwort für das hinzu, was für mich in "Typoskript" funktioniert: "3.2.4" Ich habe festgestellt, dass Jasmin in node_modules / @ types einen Ordner für ts3.1 unter dem Jasmin-Typ hat. Hier sind die Schritte: -

  • Installieren Sie Typ Jasmin npm install -D @types/jasmine
  • Zu tsconfig.json hinzufügen jasmine / ts3.1

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

  • Fügen Sie Jasmin zu den Typen hinzu

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

Hinweis: Dies istimport 'jasmine';nicht mehrerforderlich.


1

In meinem Fall wurde dieser Fehler beim Bereitstellen der App angezeigt, nicht beim Testen. Ich wusste nicht, dass ich in meiner Datei tsconfig.app.json eine andere Konfigurationseinstellung hatte.

Ich hatte vorher das:

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

Es enthielt alle meine .spec.tsDateien, wenn die App bereitgestellt wurde. Ich habe das include property toAusschließen geändert und einen regulären Ausdruck hinzugefügt, um alle Testdateien wie folgt auszuschließen:

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

Jetzt funktioniert es wie erwartet.


0

Schauen Sie sich den Import an, vielleicht haben Sie eine Zyklusabhängigkeit . Dies war in meinem Fall der Fehler. Mit import {} from 'jasmine';wird der Fehler in der Konsole behoben und der Code kompilierbar gemacht, aber die Wurzel des Teufels wird nicht entfernt (in meinem Fall die Zyklusabhängigkeit).


0

Ich arbeite mit Angular 6, Typescript 2.7, und verwende das Jest-Framework für Unit-Tests. Ich hatte innen @types/jestinstalliert und hinzugefügttypeRootstsconfig.json

Habe aber immer noch den Anzeigefehler unten (dh: am Terminal gibt es keine Fehler)

kann den Namen nicht beschreiben finden

Und den Import hinzufügen:

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

macht technisch nichts, also dachte ich, dass es irgendwo einen Import gibt, der dieses Problem verursacht, dann habe ich festgestellt, dass wenn die Datei gelöscht wird

tsconfig.spec.json

in dem src/ Ordner, löste das Problem für mich. As @types wird zuvor in die rootTypes importiert.

Ich empfehle Ihnen, dasselbe zu tun und diese Datei zu löschen. Es ist keine erforderliche Konfiguration enthalten. (ps: wenn du im selben Fall bist wie ich)


0

Wenn sich der Fehler in der .specs-Datei app / app.component.spec.ts (7,3) befindet: Fehler TS2304: Der Name 'beforeEach' wurde nicht gefunden.

Fügen Sie dies oben in Ihre Datei ein und installieren Sie npm rxjs

{range} aus 'rxjs' importieren; {map, filter} aus 'rxjs / operator' importieren;

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.