Bài kiểm tra đơn vị góc 2: Không thể tìm thấy tên 'mô tả'


213

Tôi đang theo hướng dẫn này từ angular.io

Như họ đã nói, tôi đã tạo tệp hero.spec.ts để tạo các bài kiểm tra đơn vị:

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

Bài kiểm tra đơn vị làm việc như một lá bùa. Vấn đề là: Tôi thấy một số lỗi, được đề cập trong hướng dẫn:

Biên tập viên và trình biên dịch của chúng tôi có thể phàn nàn rằng họ không biết những gì itexpectvì họ thiếu các tệp gõ mô tả Jasmine. Chúng ta có thể bỏ qua những khiếu nại gây phiền nhiễu bây giờ vì chúng vô hại.

Và họ thực sự bỏ qua nó. Mặc dù những lỗi đó là vô hại, nhưng nó không có vẻ tốt trong bảng điều khiển đầu ra của tôi khi tôi nhận được một loạt chúng.

Ví dụ về những gì tôi nhận được:

Không thể tìm thấy tên 'mô tả'.

Không thể tìm thấy tên 'nó'.

Không thể tìm thấy tên 'mong đợi'.

Tôi có thể làm gì để khắc phục nó?


Bạn có thể upvote trên Github để sửa lỗi này: github.com/TypeStrong/atom-typescript/issues/1125
Lucas Cimon

Câu trả lời:


386

Tôi hy vọng bạn đã cài đặt -

npm install --save-dev @types/jasmine

Sau đó đặt nhập sau vào đầu hero.spec.tstệp -

import 'jasmine';

Nó sẽ giải quyết vấn đề.


3
Tùy thuộc vào phiên bản của Bản in yêu cầu, bạn có thể cần phải cài đặt phiên bản cũ hơn. ví dụ: đối với ionic v2.2.1 mà tôi hiện đang sử dụng sử dụng bản in v2.0.9, tôi cần cài đặt @types/jasmine@2.5.41. Nếu không, bạn có thể thấy những lỗi biên dịch .
Tony O'Hagan

18
Bạn chỉ có thể nhập mô-đun cho các tác dụng phụ của nó:import 'jasmine';
camolin3

8
Những gì import {} from 'jasmine';thực sự làm? Có giống như import 'jasmine'vậy không?
TetraDev

2
TRONG ANGULAR 6.0.3: Tôi vừa nhập "nhập {} từ hoa nhài" và nó đã hoạt động trở lại
Eduardo Cordeiro

2
@aesede Bạn chạy phiên bản PS nào? Tôi chỉ thực hiện lệnh mà không có bất kỳ dấu ngoặc kép nào và nó đã đi rất tốt.
Konrad Viltersten

162

Với Formscript@2.0 trở lên, bạn có thể cài đặt các loại với:

npm install -D @types/jasmine

Sau đó nhập các loại tự động bằng cách sử dụng typestùy chọn trong tsconfig.json:

"types": ["jasmine"],

Giải pháp này không yêu cầu import {} from 'jasmine';trong mỗi tệp spec.


9
Mỗi tài liệu TypeScript cho tsconfig.json (v2.1 tại thời điểm này), không cần thiết phải thêm "types": ["jasmine"]dòng nữa. "Theo mặc định, tất cả các gói có thể nhìn thấy các gói @types của James được bao gồm trong phần tổng hợp của bạn. Các gói trong các loại node_modules / @ của bất kỳ thư mục kèm theo nào đều được xem là có thể nhìn thấy; cụ thể, có nghĩa là các gói trong ./node_modules/@types/, ../node_modules/@ các loại /, ../../node_modules/@types/, v.v. "
bholben

12
@bholben Tôi biết, nhưng vì một số lý do nodejasmineloại không được phát hiện. Ít nhất là nó không hoạt động đối với tôi và tôi đang sử dụng Formscript@2.1.5
Jiayi Hu

2
Giải pháp này không hiệu quả với tôi :(, xin lỗi. Tôi đã sử dụng nó ang-app/e2e/tsconfig.json. Tôi đã thử nó ở mọi cấp độ json . Bạn có thể vui lòng thêm chi tiết không?
Sergii

Điều này sẽ không hoạt động khi sử dụng webpack - trong trường hợp này, thư viện thực tế cần được phục vụ - việc nhập {} từ 'jasmine' đẩy thư viện đi qua
Bogdan

Điều này làm việc cho tôi, nhưng tôi cũng đã phải nâng cấp nguyên cảo toàn cầu của tôi để 3.5.3 (từ 2.5)
jsaddwater

27
npm install @types/jasmine

Như đã đề cập trong một số ý kiến "types": ["jasmine"]không cần thiết nữa, tất cả @typescác gói được tự động đưa vào biên dịch (kể từ phiên bản 2.1).

Theo tôi, giải pháp đơn giản nhất là loại trừ các tệp thử nghiệm trong tsconfig.json của bạn như:

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

Điều này làm việc cho tôi.

Thông tin thêm trong các tài liệu tsconfig chính thức .


3
chỉ cần một lưu ý: các dự án Angular mới có src/tsconfig.app.json, src/tsconfig.spec.jsontsconfig.json. Phần "loại trừ" được đề cập là một phần của phần 1. "types": [ "jasmine" ]một phần của thứ 2.
Martin Schneider

2
Lưu ý rằng trong Mã VS, bạn mất khả năng tìm tài liệu tham khảo trong các tệp spec của mình, vì chúng sẽ không được coi là một phần của Dự án.
mleu

@mleu Mình đang đối mặt với vấn đề tương tự. Làm thế nào bạn khắc phục vấn đề này? Mỗi lần viết trường hợp kiểm thử, tôi phải xóa mẫu tệp spec khỏi excludekhối.
Shishir Anshuman

@ShishirAnshuman: Tôi không tìm thấy giải pháp và phải sống với giới hạn này cho đến khi dự án kết thúc.
mleu

@mleu ơi. Không có vấn đề. Trong dự án của tôi như một cách giải quyết, tôi đã xóa mẫu tệp spec khỏi khối tsconfig exclude. Sau đó, tôi đã tạo một tsconfig.build.jsontệp mới với mẫu tệp spec được thêm vào excludekhối. Bây giờ, trong ts-loadertùy chọn của tôi (trong webpack.config) tôi đang sử dụng tsconfig.build.json. Với các cấu hình này, các mô-đun đang được giải quyết trong các tệp thử nghiệm và trong khi tạo bản dựng hoặc khởi động máy chủ, các tệp thử nghiệm bị loại trừ.
Shishir Anshuman 15/03/18

13

Bạn cần cài đặt typings cho hoa nhài. Giả sử bạn đang ở phiên bản tương đối gần đây của bản thảo 2, bạn sẽ có thể thực hiện:

npm install --save-dev @types/jasmine

8

Với Formscript@2.0 trở lên, bạn có thể cài đặt các loại với cài đặt npm

npm install --save-dev @types/jasmine

sau đó nhập các loại tự động bằng cách sử dụng typeRoots tùy chọn trong tsconfig.json.

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

Giải pháp này không yêu cầu nhập {} từ 'hoa nhài'; trong mỗi tệp spec.


1
Thật không may, nó không hoạt động. Nó vẫn hiển thị các lỗi trong các tệp spec
dave0688

3

Giải pháp cho vấn đề này được kết nối với những gì @Pace đã viết trong câu trả lời của anh ấy. Tuy nhiên, nó không giải thích mọi thứ vì vậy, nếu bạn không phiền, tôi sẽ tự viết nó.

GIẢI PHÁP:

Thêm dòng này:

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

ở đầu hero.spec.tstập tin sửa lỗi. Đường dẫn dẫn đến typingsthư mục (nơi lưu trữ tất cả các kiểu chữ).

Để cài đặt các kiểu chữ, bạn cần tạo typings.jsontập tin gốc trong dự án của bạn với nội dung sau:

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

Và chạy typings install( typingsgói NPM ở đâu ).


3
Đây là cách không chuẩn để làm điều này. quy tắc tslint mặc định sẽ ngăn chặn các đường dẫn tham chiếu. sử dụng tệp tsconfig để trỏ đến node_modules
FlavorScape

3

Trong trường hợp của tôi, giải pháp là loại bỏ typeRootstrong của tôi tsconfig.json.

Như bạn có thể đọc trong tài liệu TypeScript

Nếu typeRoots được chỉ định, chỉ các gói trong typeRoots sẽ được bao gồm.


3

Tôi cập nhật mới nhất vào hôm nay và tìm ra cách tốt nhất để giải quyết vấn đề này là không làm gì cả ... không typeRootskhông typeskhông excludekhông includetất cả các mặc định dường như đang hoạt động tốt. Trên thực tế, nó không hoạt động đúng với tôi cho đến khi tôi loại bỏ tất cả. Tôi đã có:

"exclude": [
    "node_modules"
]

nhưng đó là mặc định vì vậy tôi đã loại bỏ nó.

Tôi đã có:

"types": [
    "node"
]

để vượt qua một số cảnh báo trình biên dịch. Nhưng bây giờ tôi cũng loại bỏ điều đó.

Cảnh báo không nên là: error TS2304: Cannot find name 'AsyncIterable'. từnode_modules\@types\graphql\subscription\subscribe.d.ts

Điều này rất đáng ghét nên tôi đã làm điều này trong tsconfig để nó tải nó:

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

vì nó nằm trong tập esnext. Tôi không sử dụng trực tiếp nên không lo lắng về khả năng tương thích. Hy vọng điều đó không đốt cháy tôi sau này.


Bạn không cần phải thêm "types": ["node"]vào tsconfig.jsonnhưng bạn nên thêm loại này trong tsconfig.app.json! Tôi không nên có cảnh báo này một lần nữa tôi nghĩ. Bạn có thể giữ "target": "es5"hoặc "target": "es6"bây giờ.
Barshe Chevalier

2

Chỉ phải thực hiện các thao tác sau để nhận @types trong Lerna Mono-repo nơi tồn tại một số nút_modules.

npm install -D @types/jasmine

Sau đó, trong mỗi tsconfig.file của từng mô-đun hoặc ứng dụng

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

Theo mặc định, tất cả các gói có thể nhìn thấy của các nhóm @types được bao gồm trong phần tổng hợp của bạn. Các gói trong các loại node_modules / @ của bất kỳ thư mục kèm theo nào đều được xem là có thể nhìn thấy; cụ thể, điều đó có nghĩa là các gói trong ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/, v.v. Xem tài liệu chính thức
Barshe Chevalier

1

Để Trình biên dịch TypeScript sử dụng tất cả các Định nghĩa Kiểu có thể nhìn thấy trong quá trình biên dịch, typesnên loại bỏ hoàn toàn tùy chọn khỏi compilerOptionstrường trong tsconfig.jsontệp.

Vấn đề này phát sinh khi tồn tại một số typesmục trong compilerOptionstrường, trong đó cùng một jestmục bị thiếu.

Vì vậy, để khắc phục sự cố, compilerOptionstrường trong của bạn tscongfig.jsonnên bao gồm jesttrong typeskhu vực hoặc loại bỏ typeshoàn toàn:

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

Điều này làm việc cho tôi, tôi đã có google map typestrong typestùy chọn. Sau khi loại bỏ hoàn toàn tùy chọn, nó hoạt động tốt.
pritesh agrawal

1

Tôi sẽ chỉ thêm Trả lời cho những gì phù hợp với tôi trong "typecript": "3.2.4" Tôi nhận ra rằng hoa nhài trong các loại nút_modules / @ có một thư mục cho ts3.1 theo loại hoa nhài nên đây là các bước: -

  • Cài đặt loại hoa nhài npm install -D @types/jasmine
  • Thêm vào hoa nhài tsconfig.json / ts3.1

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

  • Thêm Jasmine vào các loại

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

Lưu ý: Không cần điều nàyimport 'jasmine';nữa.


1

Trong trường hợp của tôi, tôi đã gặp lỗi này khi phục vụ ứng dụng, không phải khi thử nghiệm. Tôi không nhận ra mình có cài đặt cấu hình khác trong tệp tsconfig.app.json.

Trước đây tôi đã có điều này:

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

Nó bao gồm tất cả .spec.tscác tệp của tôi khi phục vụ ứng dụng. Tôi đã thay đổi loại include property totrừ và thêm một biểu thức chính quy để loại trừ tất cả các tệp kiểm tra như thế này:

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

Bây giờ nó hoạt động như mong đợi.


0

Nhìn vào quá trình nhập có thể bạn có phụ thuộc chu kỳ , trong trường hợp của tôi là lỗi, sử dụng import {} from 'jasmine';sẽ sửa lỗi trong bảng điều khiển và làm cho mã có thể biên dịch được nhưng không loại bỏ được gốc của quỷ (trong trường hợp của tôi là phụ thuộc chu kỳ).


0

Tôi đang ở Angular 6, Typecript 2.7 và tôi đang sử dụng khung Jest để kiểm tra đơn vị. Tôi đã @types/jestcài đặt và thêm vào typeRootsbên trongtsconfig.json

Nhưng vẫn có lỗi hiển thị bên dưới (ví dụ: trên thiết bị đầu cuối không có lỗi)

không thể tìm thấy tên mô tả

Và thêm nhập:

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

Về mặt kỹ thuật không làm gì cả, vì vậy tôi nghĩ rằng có một sự nhập khẩu ở đâu đó gây ra sự cố này, sau đó tôi đã tìm thấy rằng nếu xóa tệp

tsconfig.spec.json

bên trong src/ thư mục, giải quyết vấn đề cho tôi. Vì @types được nhập trước khi vào bên trong rootTypes.

Tôi khuyên bạn nên làm như vậy và xóa tập tin này, không có cấu hình cần thiết bên trong. (ps: nếu bạn ở trong trường hợp tương tự như tôi)


0

nếu lỗi nằm trong tệp .specs app / app.component.spec.ts (7,3): lỗi TS2304: Không thể tìm thấy tên 'beforeEach'.

thêm phần này vào đầu tập tin của bạn và npm cài đặt rxjs

nhập {phạm vi} từ 'rxjs'; nhập {map, filter} từ 'rxjs / toán tử';

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.