Tes Angular 2 Unit: Tidak dapat menemukan nama 'jelaskan'

213

Saya mengikuti tutorial ini dari angular.io

Seperti yang mereka katakan, saya telah membuat file hero.spec.ts untuk membuat tes unit:

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

Tes Unit bekerja seperti pesona. Masalahnya adalah: Saya melihat beberapa kesalahan, yang disebutkan dalam tutorial:

Editor dan kompiler kami mungkin mengeluh bahwa mereka tidak tahu apa itu it dan expectkarena mereka kekurangan file pengetikan yang menggambarkan Jasmine. Kita dapat mengabaikan keluhan yang menjengkelkan itu untuk saat ini karena tidak berbahaya.

Dan mereka memang mengabaikannya. Meskipun kesalahan itu tidak berbahaya, itu tidak terlihat baik di konsol output saya ketika saya menerima banyak dari mereka.

Contoh dari apa yang saya dapatkan:

Tidak dapat menemukan nama 'jelaskan'.

Tidak dapat menemukan nama 'itu'.

Tidak dapat menemukan nama 'harap'.

Apa yang bisa saya lakukan untuk memperbaikinya?

Piotrek
sumber
Anda dapat meningkatkan suara di Github untuk memperbaiki bug ini: github.com/TypeStrong/atom-typescript/issues/1125
Lucas Cimon

Jawaban:

386

Saya harap Anda sudah menginstal -

npm install --save-dev @types/jasmine

Kemudian masukkan impor berikut di bagian atas hero.spec.tsfile -

import 'jasmine';

Itu harus menyelesaikan masalah.

ksharifbd
sumber
3
Tergantung pada versi naskah yang dibutuhkan, Anda mungkin perlu menginstal versi yang lebih lama. misalnya Untuk ionic v2.2.1 yang saat ini saya gunakan yang menggunakan typescript v2.0.9, saya perlu menginstal @types/[email protected]. Kalau tidak, Anda mungkin melihat kesalahan kompilasi ini .
Tony O'Hagan
18
Anda bisa mengimpor modul untuk efek sampingnya:import 'jasmine';
camolin3
8
Apa yang import {} from 'jasmine';sebenarnya dilakukan? Apakah sama dengan import 'jasmine'?
TetraDev
2
DI ANGULAR 6.0.3: Saya baru saja mengimpor "impor {} dari jasmine" dan berhasil lagi
Eduardo Cordeiro
2
@ aesede PS versi apa yang Anda jalankan? Saya hanya menjalankan perintah tanpa tanda kutip dan itu berjalan dengan baik.
Konrad Viltersten
162

Dengan [email protected] atau yang lebih baru Anda dapat menginstal tipe dengan:

npm install -D @types/jasmine

Kemudian impor jenis secara otomatis menggunakan typesopsi di tsconfig.json:

"types": ["jasmine"],

Solusi ini tidak diperlukan import {} from 'jasmine';di setiap file spesifikasi.

Jiayi Hu
sumber
9
Per dokumen TypeScript untuk tsconfig.json (v2.1 saat ini), tidak perlu menambahkan "types": ["jasmine"]baris lagi. "Secara default semua paket" @types "yang terlihat termasuk dalam kompilasi Anda. Paket dalam node_modules / @ jenis folder penutup dianggap terlihat; secara khusus, itu berarti paket dalam ./node_modules/@types/, ../node_modules/@ types /, ../../node_modules/@types/, dan seterusnya. "
bholben
12
@ Bunholben saya tahu, tetapi untuk beberapa alasan nodedan jasminetipe tidak terdeteksi. Setidaknya itu tidak berfungsi untuk saya dan saya menggunakan [email protected]
Jiayi Hu
2
Solusi ini tidak berfungsi untuk saya :(, maaf. Saya menggunakannya ang-app/e2e/tsconfig.json. Saya mencobanya di setiap level json . Bisakah Anda menambahkan lebih banyak detail?
Sergii
Ini tidak akan berfungsi ketika menggunakan webpack - dalam hal ini perpustakaan yang sebenarnya perlu dilayani - impor {} dari 'melati' mendorong perpustakaan melalui
Bogdan
Ini bekerja untuk saya, tetapi saya juga harus meningkatkan naskah global saya ke 3.5.3 (dari 2.5)
jsaddwater
27
npm install @types/jasmine

Seperti disebutkan dalam beberapa komentar yang "types": ["jasmine"]tidak diperlukan lagi, semua @typespaket secara otomatis dimasukkan dalam kompilasi (sejak v2.1 saya pikir).

Menurut pendapat saya solusi termudah adalah dengan mengecualikan file tes di tsconfig.json Anda seperti:

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

Ini bekerja untuk saya.

Informasi lebih lanjut dalam dokumen resmi tsconfig .

lenny
sumber
3
hanya sebuah catatan: proyek Angular baru miliki src/tsconfig.app.json, src/tsconfig.spec.jsondan tsconfig.json. Bagian "kecualikan" yang disebutkan adalah bagian dari yang pertama. "types": [ "jasmine" ]bagian ke-2.
Martin Schneider
2
Perhatikan bahwa dalam VS Code Anda kehilangan kemampuan untuk menemukan referensi dalam file spesifikasi Anda, karena mereka tidak akan dianggap sebagai bagian dari Proyek.
mleu
@mleu Saya menghadapi masalah yang sama. Bagaimana Anda memperbaiki masalah ini? Setiap kali saat menulis test case, saya harus menghapus pola file spesifikasi dari excludeblok.
Shishir Anshuman
@ShishirAnshuman: Saya tidak menemukan solusi dan harus hidup dengan keterbatasan ini sampai proyek berakhir.
mleu
@leu Oh. Tidak ada masalah. Dalam proyek saya sebagai solusinya, saya menghapus pola file spec dari excludeblok tsconfig . Kemudian saya membuat tsconfig.build.jsonfile baru dengan pola file spec ditambahkan ke excludeblok. Sekarang, dalam ts-loaderopsi saya (di webpack.config) saya menggunakan tsconfig.build.json. Dengan konfigurasi ini, modul sedang diselesaikan dalam file uji dan saat membuat build atau memulai server, file uji dikecualikan.
Shishir Anshuman
13

Anda perlu menginstal pengetikan untuk melati. Dengan asumsi Anda berada pada versi naskah 2 yang relatif baru, Anda seharusnya dapat melakukannya:

npm install --save-dev @types/jasmine
Kecepatan
sumber
8

Dengan [email protected] atau yang lebih baru Anda dapat menginstal jenis dengan instal npm

npm install --save-dev @types/jasmine

kemudian mengimpor jenis otomatis menggunakan typeRoots pilihan di tsconfig.json.

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

Solusi ini tidak memerlukan impor {} dari 'jasmine'; di setiap file spesifikasi.

mvermand
sumber
1
Sayangnya itu tidak berhasil. Itu masih menunjukkan kesalahan dalam file spesifikasi
dave0688
3

Solusi untuk masalah ini terhubung dengan apa yang telah ditulis @Pace dalam jawabannya. Namun, itu tidak menjelaskan semuanya jadi, jika Anda tidak keberatan, saya akan menulisnya sendiri.

LARUTAN:

Menambahkan baris ini:

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

di awal hero.spec.tsmasalah perbaikan file. Path mengarah ke typingsfolder (tempat semua mengetik disimpan).

Untuk menginstal pengetikan, Anda perlu membuat typings.jsonfile di root proyek Anda dengan konten berikut:

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

Dan jalankan typings install(di mana typingspaket NPM).

Piotrek
sumber
3
ini adalah cara non-standar untuk melakukan ini. aturan tslint default akan mencegah jalur referensi. gunakan file tsconfig untuk menunjuk ke node_modules
FlavorScape
3

Dalam kasus saya, solusinya adalah menghapus typeRootsdi saya tsconfig.json.

Seperti yang dapat Anda baca di dokumen TypeScript

Jika typeRoots ditentukan, hanya paket di bawah typeRoots yang akan disertakan.

moppag
sumber
3

Saya sedang mengerjakan yang terbaru hari ini dan menemukan cara terbaik untuk menyelesaikannya adalah tidak melakukan apa-apa ... typeRootstidak, typestidak, excludetidak, includesemua standarnya tampaknya berfungsi dengan baik. Sebenarnya itu tidak berhasil bagi saya sampai saya menghapus semuanya. Saya punya:

"exclude": [
    "node_modules"
]

tapi itu di default jadi saya menghapusnya.

Saya punya:

"types": [
    "node"
]

untuk melewati beberapa peringatan kompiler. Tapi sekarang saya menghapusnya juga.

Peringatan yang tidak seharusnya adalah: error TS2304: Cannot find name 'AsyncIterable'. fromnode_modules\@types\graphql\subscription\subscribe.d.ts

yang sangat menjengkelkan jadi saya melakukan ini di tsconfig sehingga memuatnya:

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

karena itu di set esnext. Saya tidak menggunakannya secara langsung sehingga belum ada kekhawatiran tentang kompatibilitas dulu. Semoga itu tidak membakar saya nanti.

philn5d
sumber
Anda tidak perlu menambahkan "types": ["node"]di tsconfig.jsontetapi Anda harus menambahkan jenis ini di tsconfig.app.json! Anda seharusnya tidak memiliki peringatan ini lagi, saya pikir. Anda bisa tetap "target": "es5"atau "target": "es6"sekarang.
Christophe Chevalier
2

Hanya harus melakukan yang berikut untuk mengambil @types di Lerna Mono-repo di mana beberapa node_modules ada.

npm install -D @types/jasmine

Kemudian di setiap file tsconfig.f setiap modul atau aplikasi

"typeRoots": [
  "node_modules/@types",
  "../../node_modules/@types" <-- I added this line
],
SoEzPz
sumber
Secara default semua paket "@types" yang terlihat termasuk dalam kompilasi Anda. Paket-paket dalam tipe node_modules / @ dari folder apa saja dianggap terlihat; secara khusus, itu berarti paket dalam ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/, dan seterusnya. Lihat dokumentasi resmi
Christophe Chevalier
1

Agar Compiler TypeScript menggunakan semua Definisi Jenis yang terlihat selama kompilasi, typesopsi harus dihapus sepenuhnya dari compilerOptionsbidang dalam tsconfig.jsonfile.

Masalah ini muncul ketika ada beberapa typesentri di compilerOptionsbidang, di mana pada saat yang sama jestentri hilang.

Jadi untuk memperbaiki masalah, compilerOptionsbidang di Anda tscongfig.jsonharus termasuk jestdi typesarea atau singkirkan typessepenuhnya:

{
  "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"
  ]
}
Omer Gurarslan
sumber
Ini bekerja untuk saya, saya punya google map typesdi typespilihan. Setelah menghapus opsi sepenuhnya, itu bekerja dengan baik.
pritesh agrawal
1

Saya hanya akan menambahkan Jawaban untuk apa yang berfungsi untuk saya di "naskah": "3.2.4" Saya menyadari bahwa melati di jenis node_modules / @ ada folder untuk ts3.1 di bawah jenis melati jadi inilah langkah-langkahnya: -

  • Pasang tipe melati npm install -D @types/jasmine
  • Tambahkan ke tsconfig.json jasmine / ts3.1

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

  • Tambahkan Jasmine ke jenis

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

Catatan: Tidak perlu untuk iniimport 'jasmine';lagi.

Eslam Mahgoub
sumber
1

Dalam kasus saya, saya mendapatkan kesalahan ini ketika saya melayani aplikasi, bukan saat pengujian. Saya tidak menyadari bahwa saya memiliki pengaturan konfigurasi yang berbeda di file tsconfig.app.json saya.

Saya sebelumnya punya ini:

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

Itu termasuk semua .spec.tsfile saya ketika melayani aplikasi. Saya mengubah include property toexclude` dan menambahkan regex untuk mengecualikan semua file pengujian seperti ini:

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

Sekarang berfungsi seperti yang diharapkan.

Raja James Enejo
sumber
0

Lihatlah impor mungkin Anda memiliki ketergantungan siklus , ini dalam kasus saya kesalahan, menggunakan import {} from 'jasmine';akan memperbaiki kesalahan di konsol dan membuat kode dapat dikompilasi tetapi tidak menghilangkan akar setan (dalam kasus saya ketergantungan siklus).

G.Vitelli
sumber
0

Saya menggunakan Angular 6, Typcript 2.7, dan saya menggunakan kerangka Jest untuk pengujian unit. Saya telah @types/jestmenginstal dan menambahkan di typeRootsdalamnyatsconfig.json

Tetapi masih memiliki tampilan kesalahan di bawah ini (yaitu: pada terminal tidak ada kesalahan)

tidak dapat menemukan nama yang diuraikan

Dan menambahkan impor:

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

secara teknis tidak melakukan apa-apa, jadi saya pikir, bahwa ada impor di suatu tempat yang menyebabkan masalah ini, maka saya menemukan, bahwa jika menghapus file

tsconfig.spec.json

di src/folder, memecahkan masalah untuk saya. Sebagai @types diimpor sebelum di dalam rootTypes.

Saya sarankan Anda untuk melakukan hal yang sama dan menghapus file ini, tidak ada konfigurasi yang diperlukan di dalam. (ps: jika Anda berada dalam kasus yang sama dengan saya)

getName
sumber
0

jika kesalahan ada di aplikasi file .specs / app.component.spec.ts (7,3): error TS2304: Tidak dapat menemukan nama 'sebelumEach'.

tambahkan ini ke atas file Anda dan instal rxjs

impor {range} dari 'rxjs'; impor {peta, filter} dari 'rxjs / operator';

cfphpflex
sumber