Test angolari su 2 unità: impossibile trovare il nome "descrivi"


213

Sto seguendo questo tutorial da angular.io

Come hanno detto, ho creato il file hero.spec.ts per creare unit test:

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

I test unitari funzionano come un incantesimo. Il problema è: vedo alcuni errori, che sono menzionati nel tutorial:

Il nostro editore e il compilatore potrebbero lamentarsi di non sapere cosa it e expectperché mancano dei file di battitura che descrivono Jasmine. Per ora possiamo ignorare quei fastidiosi reclami perché sono innocui.

E lo hanno davvero ignorato. Anche se quegli errori sono innocui, non sembra buono nella mia console di output quando ne ricevo un mucchio.

Esempio di ciò che ottengo:

Impossibile trovare il nome 'descrivi'.

Impossibile trovare il nome "it".

Impossibile trovare il nome "aspetta".

Cosa posso fare per risolverlo?


Puoi effettuare l'upgrade a Github per correggere questo errore: github.com/TypeStrong/atom-typescript/issues/1125
Lucas Cimon

Risposte:


387

Spero che tu abbia installato -

npm install --save-dev @types/jasmine

Quindi inserisci la seguente importazione nella parte superiore del hero.spec.tsfile:

import 'jasmine';

Dovrebbe risolvere il problema.


3
A seconda della versione di Typescript richiesta, potrebbe essere necessario installare una versione precedente. ad es. per ionic v2.2.1 che sto attualmente utilizzando che utilizza typescript v2.0.9, dovevo installarlo @types/jasmine@2.5.41. Altrimenti potresti vedere questi errori di compilazione .
Tony O'Hagan,

18
Potresti semplicemente importare il modulo per i suoi effetti collaterali:import 'jasmine';
camolin3

8
Cosa fa import {} from 'jasmine';effettivamente? È lo stesso di import 'jasmine'?
TetraDev,

2
IN ANGOLARE 6.0.3: Ho appena importato "import {} dal gelsomino" e ha funzionato di nuovo
Eduardo Cordeiro,

2
@aesede Quale versione di PS esegui? Ho appena eseguito il comando senza virgolette ed è andato bene.
Konrad Viltersten,

162

Con Typescript@2.0 o successivo è possibile installare i tipi con:

npm install -D @types/jasmine

Quindi importare i tipi automaticamente utilizzando l' typesopzione in tsconfig.json:

"types": ["jasmine"],

Questa soluzione non richiede import {} from 'jasmine';in ciascun file di specifica.


9
Per i documenti TypeScript per tsconfig.json (v2.1 in questo momento), non è più necessario aggiungere la "types": ["jasmine"]riga. "Per impostazione predefinita, tutti i pacchetti" @types "visibili sono inclusi nella compilation. I pacchetti in node_modules / @ tipi di qualsiasi cartella allegata sono considerati visibili; in particolare, ciò significa che i pacchetti all'interno di ./node_modules/@types/, ../node_modules/@ tipi /, ../../node_modules/@types/ e così via. "
bholben

12
@bholben Lo so, ma per qualche motivo nodee jasminetipi non vengono rilevati. Almeno non funziona per me e sto usando Typescript@2.1.5
Jiayi Hu

2
Questa soluzione non funziona per me :(, scusa. L'ho usata ang-app/e2e/tsconfig.json. L' ho provata in ogni livello json . Potresti aggiungere maggiori dettagli?
Sergii

Questo non funzionerebbe quando si utilizza il webpack - in questo caso è necessario fornire la libreria effettiva - l'importazione {} da 'jasmine' fa passare la libreria attraverso
Bogdan il

Questo ha funzionato per me, ma ho anche dovuto aggiornare il mio dattiloscritto globale alla 3.5.3 (dalla 2.5)
jsaddwater,

27
npm install @types/jasmine

Come menzionato in alcuni commenti, "types": ["jasmine"]non è più necessario, tutto@types pacchetti sono automaticamente inclusi nella compilazione (dal momento che v2.1 credo).

Secondo me la soluzione più semplice è quella di escludere i file di test nel tuo tsconfig.json come:

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

Questo funziona per me.

Ulteriori informazioni nei documenti ufficiali di tsconfig .


3
solo una nota: nuovi progetti angolari hanno src/tsconfig.app.json, src/tsconfig.spec.jsone tsconfig.json. La sezione "escludi" menzionata fa parte della prima. "types": [ "jasmine" ]parte della seconda.
Martin Schneider,

2
Nota che in VS Code perdi la possibilità di trovare riferimenti nei tuoi file delle specifiche, poiché non saranno considerati parte del Progetto.
mleu,

@mleu Sto affrontando lo stesso problema. Come hai risolto questo problema? Ogni volta che scrivo il test case, devo rimuovere il modello di file di specifiche dal excludeblocco.
Shishir Anshuman,

@ShishirAnshuman: non ho trovato una soluzione e ho dovuto convivere con questa limitazione fino alla fine del progetto.
mleu,

@mleu Oh. Nessun problema. Nel mio progetto come soluzione alternativa, ho rimosso il modello di file delle specifiche dal excludeblocco di tsconfig . Quindi ho creato un nuovo tsconfig.build.jsonfile con il modello di file di specifiche aggiunto al excludeblocco. Ora, nelle mie ts-loaderopzioni (nel webpack.config) che sto usando tsconfig.build.json. Con queste configurazioni, i moduli vengono risolti nei file di test e durante la creazione della build o l'avvio del server, i file di test vengono esclusi.
Shishir Anshuman,

13

Devi installare le digitazioni per il gelsomino. Supponendo che tu stia utilizzando una versione relativamente recente di typescript 2, dovresti essere in grado di fare:

npm install --save-dev @types/jasmine

8

Con Typescript@2.0 o successivo è possibile installare i tipi con npm install

npm install --save-dev @types/jasmine

quindi importare i tipi automaticamente utilizzando il typeRoots opzione tsconfig.json.

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

Questa soluzione non richiede l'importazione {} da 'jasmine'; in ogni file di specifica.


1
Sfortunatamente non funziona. Mostra ancora gli errori nei file delle specifiche
dave0688,

3

La soluzione a questo problema è collegata a ciò che ha scritto @Pace nella sua risposta. Tuttavia, non spiega tutto, quindi, se non ti dispiace, lo scriverò da solo.

SOLUZIONE:

Aggiunta di questa riga:

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

all'inizio del hero.spec.tsproblema con le correzioni dei file. Il percorso conduce atypings cartella (dove sono memorizzate tutte le digitazioni).

Per installare le digitazioni è necessario creare il typings.jsonfile nella radice del progetto con il seguente contenuto:

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

Ed esegui typings install(dove si typingstrova il pacchetto NPM).


3
questo è un modo non standard di farlo. le regole tslint predefinite impediranno i percorsi di riferimento. usa il file tsconfig per puntare a node_modules
FlavorScape

3

Nel mio caso, la soluzione era quella di rimuovere typeRootsnel mio tsconfig.json.

Come puoi leggere nel documento TypeScript

Se si specifica typeRoots, verranno inclusi solo i pacchetti in typeRoots.


3

Sono aggiornato fino ad oggi e ho trovato il modo migliore per risolvere questo problema è di non fare nulla ... no typeRootsno typesno excludeno includetutte le impostazioni predefinite sembrano funzionare bene. In realtà non ha funzionato bene per me fino a quando non li ho rimossi tutti. Avevo:

"exclude": [
    "node_modules"
]

ma questo è nelle impostazioni predefinite, quindi l'ho rimosso.

Avevo:

"types": [
    "node"
]

per superare alcuni avvisi del compilatore. Ma ora ho rimosso anche quello.

L'avvertimento che non dovrebbe essere è: error TS2304: Cannot find name 'AsyncIterable'. danode_modules\@types\graphql\subscription\subscribe.d.ts

che è molto odioso, quindi l'ho fatto in tsconfig in modo che lo carichi:

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

dal momento che è nel set esnext. Non lo sto usando direttamente, quindi non ci sono ancora preoccupazioni sulla compatibilità. Spero che non mi bruci più tardi.


Non è necessario aggiungere "types": ["node"]in tsconfig.json, ma si dovrebbe aggiungere questo tipo in tsconfig.app.json! Non dovresti avere di nuovo questo avviso, penso. Potresti continuare "target": "es5"o "target": "es6"ora.
Christophe Chevalier,

2

Dovevo solo fare quanto segue per prelevare @types in un Mono-repo di Lerna dove esistono diversi nodi_moduli.

npm install -D @types/jasmine

Quindi in ogni file tsconfig.file di ciascun modulo o app

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

Per impostazione predefinita, tutti i pacchetti "@types" visibili sono inclusi nella compilation. I pacchetti in node_modules / @ tipi di qualsiasi cartella allegata sono considerati visibili; in particolare, ciò significa pacchetti all'interno di ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ e così via. Vedi documentazione ufficiale
Christophe Chevalier,

1

Affinché il compilatore TypeScript utilizzi tutte le definizioni dei tipi visibili durante la compilazione, l' typesopzione deve essere rimossa completamente dal compilerOptionscampo nel tsconfig.jsonfile.

Questo problema si presenta quando esistono alcune typesvoci nel compilerOptionscampo, dove allo stesso tempo jestmanca la voce.

Quindi, al fine di risolvere il problema, compilerOptionscampo nel tscongfig.jsondovrebbe includere sia jestnella typeszona o sbarazzarsi di 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"
  ]
}

Questo ha funzionato per me, avevo google map typesl' typesopzione. Dopo aver rimosso completamente l'opzione, ha funzionato bene.
pritesh agrawal,

1

Aggiungerò solo la risposta per ciò che funziona per me in "dattiloscritto": "3.2.4" Ho capito che nel gelsomino in node_modules / @ tipi c'è una cartella per ts3.1 sotto il tipo di gelsomino, quindi ecco i passaggi: -

  • Installa il tipo jasmine npm install -D @types/jasmine
  • Aggiungi a tsconfig.json jasmine / ts3.1

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

  • Aggiungi Jasmine ai tipi

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

Nota: non è più necessario per questoimport 'jasmine';.


1

Nel mio caso, ho visualizzato questo errore quando servivo l'app, non durante i test. Non mi ero reso conto di avere un'impostazione di configurazione diversa nel mio file tsconfig.app.json.

In precedenza avevo questo:

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

Includeva tutti i miei .spec.tsfile durante la pubblicazione dell'app. Ho modificato include property toexclude` e ho aggiunto una regex per escludere tutti i file di test come questo:

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

Ora funziona come previsto.


0

Guarda l'importazione forse hai una dipendenza dal ciclo , questo è stato nel mio caso l'errore, usando import {} from 'jasmine';correggerà gli errori nella console e renderà il codice compilabile ma non rimuove la radice del diavolo (nel mio caso la dipendenza del ciclo).


0

Sono su Angular 6, Typescript 2.7 e sto usando il framework Jest per unit test. Avevo @types/jestinstallato e aggiuntotypeRoots all'internotsconfig.json

Ma presenta ancora l'errore di visualizzazione in basso (ovvero: sul terminale non ci sono errori)

impossibile trovare il nome descrivo

E aggiungendo l'importazione:

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

tecnicamente non fa nulla, quindi ho pensato, che c'è un'importazione da qualche parte che causa questo problema, quindi ho scoperto che se si elimina il file

tsconfig.spec.json

nel src/ cartella, risolto il problema per me. Poiché @types viene importato prima all'interno di rootTypes.

Ti consiglio di fare lo stesso ed eliminare questo file, non è necessaria alcuna configurazione. (ps: se sei nello stesso caso di me)


0

se l'errore si trova nel file .specs app / app.component.spec.ts (7,3): errore TS2304: impossibile trovare il nome 'beforeEach'.

aggiungi questo nella parte superiore del tuo file e npm installa rxjs

importare {range} da 'rxjs'; importare {map, filter} da 'rxjs / operatori';

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.