Testy jednostkowe Angular 2: Nie można znaleźć nazwy „opisz”


213

Obserwuję ten poradnik z angular.io

Jak powiedzieli, stworzyłem plik hero.spec.ts, aby utworzyć testy jednostkowe:

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

Testy jednostkowe działają jak urok. Problem polega na tym: widzę kilka błędów, które są wymienione w samouczku:

Nasz redaktor i kompilator mogą narzekać, że nie wiedzą co it i expectsą, ponieważ brakuje im plików do pisania opisujących Jasmine. Możemy na razie zignorować te irytujące skargi, ponieważ są one nieszkodliwe.

I rzeczywiście to zignorowali. Mimo że te błędy są nieszkodliwe, nie wyświetlają się dobrze w mojej konsoli wyjściowej, gdy otrzymam ich kilka.

Przykład tego, co otrzymuję:

Nie można znaleźć nazwy „opisz”.

Nie można znaleźć nazwy „to”.

Nie można znaleźć nazwy „oczekiwać”.

Co mogę zrobić, aby to naprawić?


Możesz głosować na Githubie, aby naprawić ten błąd: github.com/TypeStrong/atom-typescript/issues/1125
Lucas Cimon

Odpowiedzi:


386

Mam nadzieję, że zainstalowałeś -

npm install --save-dev @types/jasmine

Następnie umieść następujący import na górze hero.spec.tspliku -

import 'jasmine';

To powinno rozwiązać problem.


3
W zależności od wymaganej wersji Typescript może być konieczne zainstalowanie wcześniejszej wersji. np. W przypadku jońskiego v2.2.1, którego obecnie używam, który używa maszynopisu v2.0.9, musiałem zainstalować @types/jasmine@2.5.41. W przeciwnym razie mogą pojawić się te błędy kompilacji .
Tony O'Hagan

18
Możesz po prostu zaimportować moduł pod kątem efektów ubocznych:import 'jasmine';
camolin3

8
Co import {} from 'jasmine';właściwie robi? Czy to to samo co import 'jasmine'?
TetraDev

2
W ANGULAR 6.0.3: Właśnie zaimportowałem „import {} z jaśminu” i to znowu zadziałało
Eduardo Cordeiro

2
@aesede Jaką wersję PS prowadzisz? Właśnie wykonałem polecenie bez znaków cudzysłowu i poszło dobrze.
Konrad Viltersten

162

W Typescript@2.0 lub nowszym możesz instalować typy z:

npm install -D @types/jasmine

Następnie zaimportuj typy automatycznie, korzystając z typesopcji w tsconfig.json:

"types": ["jasmine"],

To rozwiązanie nie wymaga import {} from 'jasmine';w każdym pliku specyfikacji.


9
Zgodnie z dokumentacją TypeScript dla pliku tsconfig.json (obecnie wersja 2.1), dodawanie "types": ["jasmine"]wiersza nie jest już konieczne. „Domyślnie wszystkie widoczne pakiety„ @types ”są zawarte w twojej kompilacji. Pakiety w typach node_modules / @ dowolnego dołączonego folderu są uważane za widoczne; w szczególności oznacza to, że pakiety w ./node_modules/@types/, ../node_modules/@ typy /, ../../node_modules/@types/ itd. ”
bholben

12
@bholben Wiem, ale z jakiegoś powodu nodei jasminetypy nie są wykrywane. Przynajmniej to nie działa dla mnie i używam Typescript@2.1.5
Jiayi Hu

2
To rozwiązanie nie działa dla mnie :(, przepraszam. Użyłem go ang-app/e2e/tsconfig.json. Wypróbowałem go na każdym poziomie JSON . Czy możesz dodać więcej szczegółów?
Sergii

Nie działałoby to przy korzystaniu z webpacka - w tym przypadku należy podać rzeczywistą bibliotekę - import {} z „jaśminu” popycha bibliotekę
Bogdan

To działało dla mnie, ale musiałem także zaktualizować mój globalny maszynopis do 3.5.3 (z 2.5)
jsaddwater

27
npm install @types/jasmine

Jak wspomniano w niektórych komentarzach, "types": ["jasmine"]nie jest już potrzebne, wszystkie @typespakiety są automatycznie uwzględniane w kompilacji (od wersji 2.1 myślę, że).

Moim zdaniem najprostszym rozwiązaniem jest wykluczenie plików testowych w pliku tsconfig.json, takich jak:

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

To działa dla mnie.

Więcej informacji w oficjalnych dokumentach tsconfig .


3
tylko uwaga: nowe projekty Angular mają src/tsconfig.app.json, src/tsconfig.spec.jsoni tsconfig.json. Wspomniana sekcja „wykluczanie” jest częścią pierwszej. "types": [ "jasmine" ]część 2.
Martin Schneider,

2
Zauważ, że w VS Code tracisz możliwość znajdowania odniesień w plikach specyfikacji, ponieważ nie będą one uważane za część projektu.
mleu

@mleu Mam do czynienia z tym samym problemem. Jak rozwiązałeś ten problem? Za każdym razem, gdy piszę przypadek testowy, muszę usunąć wzorzec plików specyfikacji z excludebloku.
Shishir Anshuman

@ShishirAnshuman: Nie znalazłem rozwiązania i musiałem żyć z tym ograniczeniem aż do zakończenia projektu.
mleu

@mleu Oh. Żaden problem. W moim projekcie jako obejście tego problemu usunąłem wzorzec pliku specyfikacji z excludebloku tsconfig . Następnie utworzyłem nowy tsconfig.build.jsonplik ze wzorem pliku specyfikacji dodanym do excludebloku. Teraz w moich ts-loaderopcjach (w pliku webpack.config) używam tsconfig.build.json. W tych konfiguracjach moduły są rozwiązywane w plikach testowych, a podczas tworzenia kompilacji lub uruchamiania serwera pliki testowe są wykluczane.
Shishir Anshuman

13

Musisz zainstalować pisma dla jaśminu. Zakładając, że używasz stosunkowo nowej wersji maszynopisu 2, powinieneś być w stanie:

npm install --save-dev @types/jasmine

8

W Typescript@2.0 lub nowszym możesz instalować typy z instalacją npm

npm install --save-dev @types/jasmine

następnie zaimportować rodzaje automatycznie za pomocą typeRoots opcję w tsconfig.json.

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

To rozwiązanie nie wymaga importu {} z „jaśminu”; w każdym pliku specyfikacji.


1
Niestety to nie działa. Nadal pokazuje błędy w plikach specyfikacji
dave0688,

3

Rozwiązanie tego problemu wiąże się z tym, co @Pace napisał w swojej odpowiedzi. Jednak to nie wszystko wyjaśnia, więc jeśli nie masz nic przeciwko, napiszę to sam.

ROZWIĄZANIE:

Dodanie tej linii:

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

na początku hero.spec.tspliku naprawia problem. Ścieżka prowadzi do typingsfolderu (w którym przechowywane są wszystkie typy).

Aby zainstalować typowanie, musisz utworzyć typings.jsonplik w katalogu głównym projektu z następującą zawartością:

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

I uruchom typings install(gdzie typingsjest pakiet NPM).


3
jest to niestandardowy sposób na zrobienie tego. domyślne reguły tslint zapobiegną ścieżkom odniesienia. użyj pliku tsconfig, aby wskazać moduły_węzła
FlavorScape

3

W moim przypadku rozwiązaniem było usunięcie typeRootsw moim tsconfig.json.

Jak można przeczytać w dokumencie TypeScript

Jeśli określono typeRoots, uwzględnione zostaną tylko pakiety typu typeRoots.


3

Jestem na bieżąco i odkryłem, że najlepszym sposobem na rozwiązanie tego jest nic nie robienie ... nie typeRootsnie typesnie excludenie includewszystkie domyślne wydają się działać dobrze. Właściwie nie działało to dla mnie, dopóki nie usunąłem ich wszystkich. Miałem:

"exclude": [
    "node_modules"
]

ale jest to ustawienie domyślne, więc to usunąłem.

Miałem:

"types": [
    "node"
]

ominąć ostrzeżenie kompilatora. Ale teraz to też usunąłem.

Ostrzeżenie, które nie powinno być: error TS2304: Cannot find name 'AsyncIterable'. odnode_modules\@types\graphql\subscription\subscribe.d.ts

co jest bardzo wstrętne, więc zrobiłem to w tsconfig, aby go załadować:

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

ponieważ jest w zestawie esnext. Nie używam go bezpośrednio, więc nie martw się o kompatybilność. Mam nadzieję, że później mnie to nie pali.


Nie trzeba dodawać "types": ["node"]w tsconfig.jsonale należy dodać tego typu tsconfig.app.json! Myślę, że nie powinieneś mieć tego ostrzeżenia ponownie. Możesz zatrzymać "target": "es5"lub "target": "es6"teraz.
Christophe Chevalier

2

Wystarczyło wykonać następujące czynności, aby pobrać @typy w mono-repozytorium Lerna, w którym istnieje kilka modułów_węzła.

npm install -D @types/jasmine

Następnie w każdym pliku tsconfig. Każdego modułu lub aplikacji

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

Domyślnie wszystkie widoczne pakiety „@types” są zawarte w twojej kompilacji. Pakiety w typach node_modules / @ dowolnego otaczającego folderu są uważane za widoczne; w szczególności oznacza to pakiety w ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ i tak dalej. Zobacz oficjalną dokumentację
Christophe Chevalier

1

Aby kompilator TypeScript mógł korzystać ze wszystkich widocznych definicji typu podczas kompilacji, typesnależy całkowicie usunąć opcję z compilerOptionspola w tsconfig.jsonpliku.

Ten problem powstaje, gdy istnieją pewne typeswpisy w compilerOptionspolu, w których jednocześnie jestbrakuje wpisu.

Tak, aby rozwiązać ten problem, compilerOptionspól w tscongfig.jsonpowinny obejmować zarówno jestw typesobszarze lub pozbyć 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"
  ]
}

Ten pracował dla mnie, miałem google map typesw typesopcji. Po całkowitym usunięciu opcji działało dobrze.
pritesh agrawal

1

Dodam tylko odpowiedź dla tego, co działa dla mnie w „maszynopisie”: „3.2.4” Zdałem sobie sprawę, że jaśmin w node_modules / @ types jest folder dla ts3.1 pod typem jaśminu, więc oto kroki: -

  • Zainstaluj typ jaśminu npm install -D @types/jasmine
  • Dodaj do tsconfig.json jasmine / ts3.1

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

  • Dodaj Jasmine do typów

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

Uwaga: Nie trzeba za toimport 'jasmine';więcej.


1

W moim przypadku ten błąd pojawiał się podczas udostępniania aplikacji, a nie podczas testowania. Nie zdawałem sobie sprawy, że mam inne ustawienie konfiguracji w moim pliku tsconfig.app.json.

Wcześniej miałem to:

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

Zawierał wszystkie moje .spec.tspliki podczas udostępniania aplikacji. Zmieniłem include property towyjątek i dodałem wyrażenie regularne, aby wykluczyć wszystkie pliki testowe w następujący sposób:

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

Teraz działa zgodnie z oczekiwaniami.


0

Spójrz na import, może masz zależność cyklu , to był w moim przypadku błąd, użycie import {} from 'jasmine';naprawi błędy w konsoli i sprawi, że kod będzie kompilowalny, ale nie usunie korzenia diabła (w moim przypadku zależność cyklu).


0

Korzystam z Angular 6, Typescript 2.7 i używam frameworku Jest do testowania jednostkowego. Miałem @types/jestzainstalowany i dodany typeRootswewnątrztsconfig.json

Ale nadal wyświetlany jest błąd wyświetlania (tj .: na terminalu nie ma błędów)

nie można znaleźć nazwy opisującej

I dodając import:

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

technicznie nic nie robi, więc pomyślałem, że gdzieś jest import powodujący ten problem, wtedy stwierdziłem, że jeśli usuniesz plik

tsconfig.spec.json

w src/folderze rozwiązałem problem dla mnie. Ponieważ @types jest importowany przed wewnątrz rootTypes.

Polecam zrobić to samo i usunąć ten plik, nie jest wymagana żadna konfiguracja. (ps: jeśli jesteś w tym samym przypadku co ja)


0

jeśli błąd występuje w pliku .specs app / app.component.spec.ts (7,3): błąd TS2304: Nie można znaleźć nazwy „przed każdym”.

dodaj to na początku pliku i npm zainstaluj rxjs

import {range} z 'rxjs'; import {map, filter} z 'rxjs / operators';

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.