Pruebas de unidad angular 2: no se puede encontrar el nombre 'describir'


213

Estoy siguiendo este tutorial de angular.io

Como dijeron, he creado el archivo hero.spec.ts para crear pruebas unitarias:

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

Las pruebas unitarias funcionan como un encanto. El problema es: veo algunos errores, que se mencionan en el tutorial:

Nuestro editor y el compilador pueden quejarse de que no saben qué it y expectporque carecen de los archivos de mecanografía que describen a Jasmine. Podemos ignorar esas molestas quejas por ahora, ya que son inofensivas.

Y de hecho lo ignoraron. Aunque esos errores son inofensivos, no se ve bien en mi consola de salida cuando recibo muchos de ellos.

Ejemplo de lo que obtengo:

No se puede encontrar el nombre 'describir'.

No se puede encontrar el nombre 'it'.

No se puede encontrar el nombre 'esperar'.

¿Que puedo hacer para arreglarlo?


Puede votar en Github para corregir este error: github.com/TypeStrong/atom-typescript/issues/1125
Lucas Cimon el

Respuestas:


386

Espero que hayas instalado

npm install --save-dev @types/jasmine

Luego coloque la siguiente importación en la parte superior del hero.spec.tsarchivo:

import 'jasmine';

Debería resolver el problema.


3
Dependiendo de la versión de Typecript requerida, es posible que deba instalar una versión anterior. Por ejemplo v2.2.1 iónica que estoy usando actualmente que los usos mecanografiado v2.0.9, necesitaba instalar @types/jasmine@2.5.41. De lo contrario, puede ver estos errores de compilación .
Tony O'Hagan

18
Puede importar el módulo por sus efectos secundarios:import 'jasmine';
camolin3

8
¿Qué hace import {} from 'jasmine';realmente? ¿Es lo mismo que import 'jasmine'?
TetraDev

2
EN ANGULAR 6.0.3: acabo de importar "import {} from jazmín" y funcionó nuevamente
Eduardo Cordeiro

2
@aesede ¿Qué versión de PS ejecutas? Acabo de ejecutar el comando sin comillas y salió bien.
Konrad Viltersten

162

Con Typecript@2.0 o posterior puede instalar tipos con:

npm install -D @types/jasmine

Luego importe los tipos automáticamente usando la typesopción en tsconfig.json:

"types": ["jasmine"],

Esta solución no requiere import {} from 'jasmine';en cada archivo de especificaciones.


99
Según los documentos de TypeScript para tsconfig.json (v2.1 en este momento), ya no es necesario agregar la "types": ["jasmine"]línea. "Por defecto, todos los paquetes visibles" @types "están incluidos en su compilación. Los paquetes en node_modules / @ tipos de cualquier carpeta adjunta se consideran visibles; específicamente, eso significa paquetes dentro de ./node_modules/@types/, ../node_modules/@ tipos /, ../../node_modules/@types/, y así sucesivamente ".
bholben

12
@bholben lo sé, pero por alguna razón nodey jasminetipos no son detectados. Al menos no funciona para mí y estoy usando Typescript@2.1.5
Jiayi Hu

2
Esta solución no me funciona :(, lo siento. Lo usé ang-app/e2e/tsconfig.json. Lo probé en todos los niveles json . ¿Podría agregar más detalles?
Sergii

Esto no funcionaría cuando se usa webpack, en este caso la biblioteca real necesita ser servida, la importación {} de 'jazmín' empuja la biblioteca a través de
Bogdan

Esto funcionó para mí, pero también tuve que actualizar mi mecanografiado global a 3.5.3 (desde 2.5)
jsaddwater

27
npm install @types/jasmine

Como se menciona en algunos comentarios "types": ["jasmine"], ya no es necesario, todos los @typespaquetes se incluyen automáticamente en la compilación (desde la versión 2.1, creo).

En mi opinión, la solución más fácil es excluir los archivos de prueba en su tsconfig.json como:

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

Esto funciona para mi.

Más información en los documentos oficiales de tsconfig .


3
solo una nota: los nuevos proyectos angulares tienen src/tsconfig.app.json, src/tsconfig.spec.jsony tsconfig.json. La mencionada sección "excluir" es parte de la primera. "types": [ "jasmine" ]parte de la 2da.
Martin Schneider

2
Tenga en cuenta que en VS Code pierde la capacidad de encontrar referencias en sus archivos de especificaciones, ya que no se considerarán parte del Proyecto.
mleu

@mleu Estoy enfrentando el mismo problema. ¿Cómo solucionó este problema? Cada vez que escribo el caso de prueba, tengo que eliminar el patrón de archivos de especificaciones del excludebloque.
Shishir Anshuman

@ShishirAnshuman: No encontré una solución y tuve que vivir con esta limitación hasta que finalizó el proyecto.
mleu

@mleu Oh. Sin problema. En mi proyecto como solución alternativa, eliminé el patrón del archivo de especificaciones del excludebloque tsconfig . Luego creé un nuevo tsconfig.build.jsonarchivo con el patrón de archivo de especificaciones agregado al excludebloque. Ahora, en mis ts-loaderopciones (en el webpack.config) que estoy usando tsconfig.build.json. Con estas configuraciones, los módulos se resuelven en los archivos de prueba y al crear la compilación o iniciar el servidor, se excluyen los archivos de prueba.
Shishir Anshuman

13

Necesita instalar tipings para jazmín. Suponiendo que se encuentra en una versión relativamente reciente del mecanografiado 2, debería poder hacer:

npm install --save-dev @types/jasmine

8

Con Typescript@2.0 o posterior puede instalar tipos con npm install

npm install --save-dev @types/jasmine

luego importar los tipos automáticamente utilizando el typeRoots opción en tsconfig.json.

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

Esta solución no requiere importación {} desde 'jazmín'; en cada archivo de especificaciones.


1
Lamentablemente eso no funciona. Todavía muestra los errores en los archivos de especificaciones
dave0688

3

La solución a este problema está relacionada con lo que @Pace ha escrito en su respuesta. Sin embargo, no explica todo, así que, si no te importa, lo escribiré yo mismo.

SOLUCIÓN:

Agregando esta línea:

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

al comienzo del hero.spec.tsarchivo corrige el problema. La ruta conduce a la typingscarpeta (donde se almacenan todos los tipos).

Para instalar tipings, debe crear un typings.jsonarchivo en la raíz de su proyecto con el siguiente contenido:

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

Y ejecutar typings install(donde typingsestá el paquete NPM).


3
Esta es una forma no estándar de hacerlo. Las reglas predeterminadas de tslint evitarán las rutas de referencia. use el archivo tsconfig para apuntar a node_modules
FlavorScape

3

En mi caso, la solución fue eliminar el typeRootsen mi tsconfig.json.

Como puedes leer en el documento de TypeScript

Si se especifica typeRoots, solo se incluirán los paquetes de typeRoots.


3

Estoy a la última hasta el día de hoy y encontré que la mejor manera de resolver esto es no hacer nada ... no typeRootsno typesno excludeno, includetodos los valores predeterminados parecen funcionar bien. En realidad, no funcionó bien para mí hasta que los eliminé a todos. Yo tenía:

"exclude": [
    "node_modules"
]

pero eso está en los valores predeterminados, así que eliminé eso.

Yo tenía:

"types": [
    "node"
]

para pasar alguna advertencia del compilador. Pero ahora también lo eliminé.

La advertencia que no debería ser es: error TS2304: Cannot find name 'AsyncIterable'. desdenode_modules\@types\graphql\subscription\subscribe.d.ts

lo cual es muy desagradable, así que hice esto en tsconfig para que lo cargue:

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

ya que está en el conjunto esnext. No lo estoy usando directamente, así que todavía no me preocupa la compatibilidad. Espero que eso no me queme más tarde.


No es necesario añadir "types": ["node"]en tsconfig.jsonpero se debe añadir en este tipo tsconfig.app.json! No debería volver a tener esta advertencia, creo. Podrías quedarte "target": "es5"o "target": "es6"ahora.
Christophe Chevalier

2

Solo tenía que hacer lo siguiente para recoger @types en un Lerna Mono-repo donde existen varios node_modules.

npm install -D @types/jasmine

Luego, en cada archivo tsconfig.file de cada módulo o aplicación

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

Por defecto, todos los paquetes visibles "@types" están incluidos en su compilación. Los paquetes en node_modules / @ tipos de cualquier carpeta adjunta se consideran visibles; específicamente, eso significa paquetes dentro de ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/, y así sucesivamente. Ver documentación oficial
Christophe Chevalier

1

Para que el compilador TypeScript use todas las definiciones de tipo visibles durante la compilación, la typesopción debe eliminarse completamente del compilerOptionscampo en el tsconfig.jsonarchivo.

Este problema surge cuando existen algunas typesentradas en el compilerOptionscampo, donde al mismo tiempo jestfalta la entrada.

Entonces, para solucionar el problema, el compilerOptionscampo en su tscongfig.jsondebe incluir jesten el typesárea o deshacerse por typescompleto:

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

Esto funcionó para mí, tenía google map typesla typesopción. Después de eliminar la opción por completo, funcionó bien.
pritesh agrawal

1

Solo agregaré Respuesta para lo que funciona para mí en "mecanografiado": "3.2.4" Me di cuenta de que jazmín en node_modules / @ types hay una carpeta para ts3.1 debajo del tipo de jazmín, así que aquí están los pasos:

  • Instalar tipo jazmín npm install -D @types/jasmine
  • Añadir a tsconfig.json jasmine / ts3.1

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

  • Agregar jazmín a los tipos

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

Nota: Ya no es necesario para estoimport 'jasmine';.


1

En mi caso, recibí este error cuando sirvo la aplicación, no cuando la pruebo. No me di cuenta de que tenía una configuración diferente en mi archivo tsconfig.app.json.

Anteriormente tuve esto:

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

Incluía todos mis .spec.tsarchivos cuando servía la aplicación. Cambié la include property toexclusión 'y agregué una expresión regular para excluir todos los archivos de prueba como este:

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

Ahora funciona como se esperaba.


0

Mire la importación, tal vez tenga una dependencia del ciclo , este fue en mi caso el error, el uso import {} from 'jasmine';solucionará los errores en la consola y hará que el código sea compilable pero no elimine la raíz del diablo (en mi caso, la dependencia del ciclo).


0

Estoy en Angular 6, Typecript 2.7, y estoy usando Jest Framework para la prueba unitaria. Había @types/jestinstalado y añadido en typeRootsel interiortsconfig.json

Pero aún tiene el error de visualización a continuación (es decir: en el terminal no hay errores)

no puedo encontrar el nombre describir

Y agregando la importación:

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

técnicamente no hace nada, así que pensé que hay una importación en algún lugar que causa este problema, entonces descubrí que si eliminaba el archivo

tsconfig.spec.json

en la src/carpeta, resolvió el problema para mí. Como @types se importa antes dentro de los rootTypes.

Le recomiendo que haga lo mismo y elimine este archivo, no hay configuración necesaria dentro. (ps: si estás en el mismo caso que yo)


0

si el error está en el archivo .specs app / app.component.spec.ts (7,3): error TS2304: No se puede encontrar el nombre 'beforeEach'.

agregue esto a la parte superior de su archivo y npm instale rxjs

importar {rango} desde 'rxjs'; importar {mapa, filtro} desde 'rxjs / operadores';

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.