web-dev-qa-db-fra.com

Tests angulaires à 2 unités: le nom "décrire" est introuvable

Je suis ce tutoriel d'angular.io

Comme ils l'ont dit, j'ai créé le fichier hero.spec.ts pour créer des tests unitaires:

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

Les tests unitaires fonctionnent comme un charme. Le problème est: je vois quelques erreurs, qui sont mentionnées dans le tutoriel:

Notre éditeur et le compilateur peuvent se plaindre de ne pas savoir ce que it et expect sont dus au manque des fichiers de typage décrivant Jasmin. Nous pouvons ignorer ces plaintes ennuyeuses pour l'instant telles qu'elles sont inoffensif.

Et ils l'ont effectivement ignoré. Même si ces erreurs sont inoffensives, cela n’apparaît pas très bien dans ma console de sortie lorsque j'en reçois beaucoup.

Exemple de ce que je reçois:

Impossible de trouver le nom 'décrire'.

Impossible de trouver le nom 'it'.

Impossible de trouver le nom 's'attendre'.

Que puis-je faire pour le réparer?

162
Piotrek

J'espère que vous avez installé -

npm install --save-dev @types/jasmine

Ensuite, placez l’importation suivante en haut du fichier hero.spec.ts -

import {} from 'jasmine';

Cela devrait résoudre le problème.

334
ksharifbd

Avec [email protected] ou version ultérieure, vous pouvez installer les types avec:

npm install -D @types/jasmine

Importez ensuite les types automatiquement à l'aide de l'option types dans tsconfig.json:

"types": ["jasmine"],

Cette solution ne nécessite pas import {} from 'jasmine'; dans chaque fichier de spécifications.

136
Jiayi Hu
npm install @types/jasmine

Comme mentionné dans certains commentaires, le "types": ["jasmine"] n'est plus nécessaire, tous les packages @types sont automatiquement inclus dans la compilation (depuis la v2.1 je pense).

À mon avis, la solution la plus simple consiste à exclure les fichiers de test de votre tsconfig.json comme suit: 

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

Cela fonctionne pour moi.

Plus d'informations dans les documents officiels tsconfig .

23
lenny

Vous devez installer des typographies pour le jasmin. En supposant que vous utilisez une version relativement récente de TypeScript 2, vous devriez être capable de faire:

npm install --save-dev @types/jasmine

13
Pace

Avec [email protected] ou version ultérieure, vous pouvez installer des types avec npm install 

npm install --save-dev @types/jasmine

puis importez les types automatiquement en utilisant l’option typeRoots dans tsconfig.json.

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

Cette solution ne nécessite pas l'importation {} de 'jasmine'; dans chaque fichier de spécifications.

7
mvermand

Je suis au courant des dernières nouvelles et j'ai trouvé que le meilleur moyen de résoudre ce problème est de ne rien faire ... non typeRoots non types non exclude non include tous les valeurs par défaut semblent bien fonctionner. En fait, cela ne fonctionnait pas pour moi tant que je ne les ai pas tous supprimés. J'avais: "exclude": [ "node_modules" ] Mais c'est dans les valeurs par défaut alors j'ai enlevé ça.

J'avais: "types": [ "node" ] pour dépasser un avertissement du compilateur. Mais maintenant j'ai enlevé ça aussi.

L'avertissement qui ne devrait pas être est: error TS2304: Cannot find name 'AsyncIterable'. À partir de node_modules\@types\graphql\subscription\subscribe.d.ts

ce qui est très odieux alors je l'ai fait dans tsconfig pour qu'il le charge: "compilerOptions": { "target": "esnext", } puisqu'il est dans le jeu esnext. Je ne l'utilise pas directement, alors ne vous inquiétez pas pour le moment de la compatibilité. J'espère que ça ne me brûlera pas plus tard.

3
philn5d

La solution à ce problème est liée à ce que @Pace a écrit dans sa réponse. Cependant, cela n'explique pas tout, alors, si cela ne vous dérange pas, je vais l'écrire moi-même.

SOLUTION:

Ajout de cette ligne:

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

au début du fichier hero.spec.ts corrige le problème. Le chemin mène au dossier typings (où sont stockés tous les types de saisie).

Pour installer des typages, vous devez créer un fichier typings.json à la racine de votre projet avec le contenu suivant:

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

Et exécutez typings install (où typings est le package NPM).

3
Piotrek

Il suffisait de faire ce qui suit pour récupérer les @ types dans un Lerna Mono-repo .__ où plusieurs node_modules existent.

npm install -D @types/jasmine

Puis dans chaque fichier tsconfig.file de chaque module ou application

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

Dans mon cas, la solution consistait à supprimer la typeRoots dans mon tsconfig.json.

Comme vous pouvez le lire dans le doc TypeScript

Si typeRoots est spécifié, seuls les packages sous typeRoots seront inclus.

2
moppag

Je suis sur 'Angular 6', 'TypeScript 2.7', et j'utilise le framework 'plaisant' pour tester l'unité, '@ types/jest' installé et ajouté sur 'typeRoots' à ​​l'intérieur de 'tsconfig.json'.
Mais l’erreur d’affichage ci-dessous persiste (c’est-à-dire qu’il n’ya pas d’erreur sur le terminal)

ne trouve pas le nom décrit

Et en ajoutant l'importation:

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

ne fait techniquement rien, alors je pensais qu'il y avait une importation quelque part causant ce problème, alors j'ai trouvé que si supprimer le fichier 

tsconfigspec.json 

dans le dossier src/, a résolu le problème pour moi. En tant que @types _ est préalablement importé à l'intérieur de rootTypes..____.
Je vous recommande de faire de même et de supprimer ce fichier, aucune configuration nécessaire n’est à l’intérieur. (ps: si vous êtes dans le même cas que moi)
✌✌✌

0
getName

Regardez l’importation peut-être que vous avez une dépendance cycle , c’était dans mon cas l’erreur, utiliser import {} from 'jasmine'; corrigera les erreurs dans la console et rendra le code compilable sans supprimer la racine dépendance).

0
G.Vitelli

Pour que TypeScript Compiler utilise toutes les définitions de type visibles lors de la compilation, l’option types doit être complètement supprimée du champ compilerOptions du fichier tsconfig.json

Ce problème survient lorsqu'il existe des entrées types dans le champ compilerOptions, où en même temps l'entrée jest est manquante.

Par conséquent, afin de résoudre le problème, le champ compilerOptions de votre tscongfig.json devrait soit inclure jest dans la zone types, soit se débarrasser de types de façon complète:

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

Je vais juste ajouter Answer pour ce qui fonctionne pour moi dans "TypeScript": "3.2.4" J'ai réalisé que jasmine dans node_modules/@ types comporte un dossier pour ts3.1 sous le type jasmine, voici donc les étapes: -

  • Type d'installation jasmine npm install -D @types/jasmine
  • Ajouter à tsconfig.json jasmine/ts3.1

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

  • Ajouter Jasmine aux types

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

Remarque: Plus besoin de ce import 'jasmine';.

0
Eslam Mahgoub