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
iexpect
są, 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ć?
unit-testing
angular
typescript
jasmine
Piotrek
źródło
źródło
Odpowiedzi:
Mam nadzieję, że zainstalowałeś -
Następnie umieść następujący import na górze
hero.spec.ts
pliku -To powinno rozwiązać problem.
źródło
@types/[email protected]
. W przeciwnym razie mogą pojawić się te błędy kompilacji .import 'jasmine';
import {} from 'jasmine';
właściwie robi? Czy to to samo coimport 'jasmine'
?W [email protected] lub nowszym możesz instalować typy z:
Następnie zaimportuj typy automatycznie, korzystając z
types
opcji wtsconfig.json
:To rozwiązanie nie wymaga
import {} from 'jasmine';
w każdym pliku specyfikacji.źródło
"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. ”node
ijasmine
typy nie są wykrywane. Przynajmniej to nie działa dla mnie i używam [email protected]ang-app/e2e/tsconfig.json
. Wypróbowałem go na każdym poziomie JSON . Czy możesz dodać więcej szczegółów?Jak wspomniano w niektórych komentarzach,
"types": ["jasmine"]
nie jest już potrzebne, wszystkie@types
pakiety 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:
To działa dla mnie.
Więcej informacji w oficjalnych dokumentach tsconfig .
źródło
src/tsconfig.app.json
,src/tsconfig.spec.json
itsconfig.json
. Wspomniana sekcja „wykluczanie” jest częścią pierwszej."types": [ "jasmine" ]
część 2.exclude
bloku.exclude
bloku tsconfig . Następnie utworzyłem nowytsconfig.build.json
plik ze wzorem pliku specyfikacji dodanym doexclude
bloku. Teraz w moichts-loader
opcjach (w pliku webpack.config) używamtsconfig.build.json
. W tych konfiguracjach moduły są rozwiązywane w plikach testowych, a podczas tworzenia kompilacji lub uruchamiania serwera pliki testowe są wykluczane.Musisz zainstalować pisma dla jaśminu. Zakładając, że używasz stosunkowo nowej wersji maszynopisu 2, powinieneś być w stanie:
źródło
W [email protected] lub nowszym możesz instalować typy z instalacją npm
następnie zaimportować rodzaje automatycznie za pomocą typeRoots opcję w tsconfig.json.
To rozwiązanie nie wymaga importu {} z „jaśminu”; w każdym pliku specyfikacji.
źródło
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:
na początku
hero.spec.ts
pliku naprawia problem. Ścieżka prowadzi dotypings
folderu (w którym przechowywane są wszystkie typy).Aby zainstalować typowanie, musisz utworzyć
typings.json
plik w katalogu głównym projektu z następującą zawartością:I uruchom
typings install
(gdzietypings
jest pakiet NPM).źródło
W moim przypadku rozwiązaniem było usunięcie
typeRoots
w moimtsconfig.json
.Jak można przeczytać w dokumencie TypeScript
źródło
Jestem na bieżąco i odkryłem, że najlepszym sposobem na rozwiązanie tego jest nic nie robienie ... nie
typeRoots
nietypes
nieexclude
nieinclude
wszystkie 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:ale jest to ustawienie domyślne, więc to usunąłem.
Miałem:
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ć:
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.
źródło
"types": ["node"]
wtsconfig.json
ale należy dodać tego typutsconfig.app.json
! Myślę, że nie powinieneś mieć tego ostrzeżenia ponownie. Możesz zatrzymać"target": "es5"
lub"target": "es6"
teraz.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.
Następnie w każdym pliku tsconfig. Każdego modułu lub aplikacji
źródło
Aby kompilator TypeScript mógł korzystać ze wszystkich widocznych definicji typu podczas kompilacji,
types
należy całkowicie usunąć opcję zcompilerOptions
pola wtsconfig.json
pliku.Ten problem powstaje, gdy istnieją pewne
types
wpisy wcompilerOptions
polu, w których jednocześniejest
brakuje wpisu.Tak, aby rozwiązać ten problem,
compilerOptions
pól wtscongfig.json
powinny obejmować zarównojest
wtypes
obszarze lub pozbyćtypes
comnpletely:źródło
google map types
wtypes
opcji. Po całkowitym usunięciu opcji działało dobrze.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: -
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 to
import 'jasmine';
więcej.źródło
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:
Zawierał wszystkie moje
.spec.ts
pliki podczas udostępniania aplikacji. Zmieniłeminclude property to
wyjątek i dodałem wyrażenie regularne, aby wykluczyć wszystkie pliki testowe w następujący sposób:Teraz działa zgodnie z oczekiwaniami.
źródło
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).źródło
Korzystam z Angular 6, Typescript 2.7 i używam frameworku Jest do testowania jednostkowego. Miałem
@types/jest
zainstalowany i dodanytypeRoots
wewnątrztsconfig.json
Ale nadal wyświetlany jest błąd wyświetlania (tj .: na terminalu nie ma błędów)
I dodając import:
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
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)
źródło
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';
źródło