Тестові кутові 2 одиниці тестування: Неможливо знайти назву "описувати"


213

Я стежу за цим підручником з angular.io

Як вони сказали, я створив файл hero.spec.ts для створення одиничних тестів:

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

Тести підрозділу працюють як шарм. Проблема полягає в тому, що я бачу деякі помилки, про які йдеться у підручнику:

Наш редактор і компілятор може скаржитися , що вони не знають , що it і expectє , тому що у них немає типізації файли, що описують жасмин. Наразі ми можемо ігнорувати ці дратівливі скарги, оскільки вони нешкідливі.

І вони справді проігнорували це. Незважаючи на те, що ці помилки нешкідливі, це не добре виглядає на моїй вихідній консолі, коли я отримую купу їх.

Приклад того, що я отримую:

Не вдається знайти назву "описувати".

Неможливо знайти назву "це".

Не вдається знайти назву "очікувати".

Що я можу зробити, щоб це виправити?


Ви можете подати заявку на Github, щоб виправити цю помилку: github.com/TypeStrong/atom-typescript/isissue/1125
Лукас Кімон

Відповіді:


386

Я сподіваюся, що ви встановили -

npm install --save-dev @types/jasmine

Потім поставте наступний імпорт у верхній частині hero.spec.tsфайлу -

import 'jasmine';

Це має вирішити проблему.


3
Залежно від необхідної версії Typescript, можливо, вам знадобиться встановити більш ранню версію. Наприклад, для ionic v2.2.1, який я зараз використовую, який використовує typecript v2.0.9, мені потрібно було встановити @types/jasmine@2.5.41. Інакше ви можете побачити ці помилки компіляції .
Тоні

18
Ви можете просто імпортувати модуль для його побічних ефектів:import 'jasmine';
camolin3

8
Що import {} from 'jasmine';насправді робить? Це те саме, що import 'jasmine'?
TetraDev

2
ДЛЯ АНГУЛЯРНО 6.0.3: Я щойно імпортував "імпорт {} з жасмину", і він працював знову
Едуардо Кордейро

2
@aesede Яку версію PS ви запускаєте? Я просто виконав команду без жодних лапок, і вона пройшла добре.
Конрад Вільтерстен

162

За допомогою Typescript@2.0 або новішої версії ви можете встановлювати типи за допомогою:

npm install -D @types/jasmine

Потім імпортуйте типи автоматично, використовуючи typesопцію в tsconfig.json:

"types": ["jasmine"],

Це рішення не потребує import {} from 'jasmine';у кожному специфікаційному файлі.


9
На документи TypeScript для tsconfig.json (на даний момент v2.1), "types": ["jasmine"]рядок більше не потрібно додавати . "За замовчуванням всі видимі пакети" @types "включені до вашої компіляції. Пакети в node_modules / @ типів будь-якої вкладеної папки вважаються видимими; зокрема, це означає пакети в ./node_modules/@types/, ../node_modules/@ типи /, ../../node_modules/@types/ тощо. "
bholben

12
@bholben Я знаю, але чомусь nodeі jasmineтипи не виявляються. Принаймні, це не працює для мене, і я використовую Typescript@2.1.5
Jiayi Ху

2
Це рішення не працює для мене :(, вибачте. Я використовував це ang-app/e2e/tsconfig.json. Я намагався на кожному рівні json . Чи можете ви додайте більше деталей?
Сергій

Це не спрацює при використанні webpack - у цьому випадку потрібно обслуговувати фактичну бібліотеку - імпорт {} з 'жасмину' проштовхує бібліотеку через
Богдан

Це працювало для мене, але мені також довелося оновити свій глобальний машинопис до 3.5.3 (з 2.5)
jsaddwater

27
npm install @types/jasmine

Як згадується в деяких коментарях, "types": ["jasmine"]це більше не потрібно, всі @typesпакунки автоматично включаються в компіляцію (оскільки я думаю, що v2.1).

На мою думку, найпростішим рішенням є виключення тестових файлів у вашому tsconfig.json, наприклад:

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

Це працює для мене.

Детальна інформація в офіційних документах tsconfig .


3
лише примітка: нові кутові проекти мають src/tsconfig.app.json, src/tsconfig.spec.jsonі tsconfig.json. Згаданий розділ "виключити" є частиною 1-го. "types": [ "jasmine" ]частина 2-ї.
Мартін Шнайдер

2
Зауважте, що в коді VS ви втрачаєте можливість знаходити посилання у своїх специфікаційних файлах, оскільки вони не вважатимуться частиною Проекту.
mleu

@mleu Я зіткнувся з тією ж проблемою. Як ви вирішили цю проблему? Кожен раз, коли пишуть тестовий випадок, мені доводиться видаляти зразок файлів специфікації з excludeблоку.
Шишир Аншуман

@ShishirAnshuman: Я не знайшов рішення і мусив жити з цим обмеженням, поки проект не закінчився.
mleu

@mleu О. Немає питання. У своєму проекті як вирішення проблеми я видалив шаблон специфікації з excludeблоку tsconfig . Тоді я створив новий tsconfig.build.jsonфайл із шаблоном файла специфікації, доданим до excludeблоку. Тепер у своїх ts-loaderпараметрах (у webpack.config) я використовую tsconfig.build.json. За допомогою цих конфігурацій модулі вирішуються в тестових файлах і під час створення збірки або запуску сервера тестові файли виключаються.
Шишир Аншуман

13

Потрібно встановити тихінги для жасмину. Якщо припустити, що ви користуєтеся відносно недавньою версією машинопису 2, ви повинні мати можливість:

npm install --save-dev @types/jasmine

8

За допомогою Typescript@2.0 або пізнішої версії ви можете встановлювати типи з npm install

npm install --save-dev @types/jasmine

потім імпортуйте типи автоматично за допомогою параметра typeRoots в tsconfig.json.

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

Це рішення не потребує імпорту {} з "жасмину"; у кожному файлі специфікації.


1
На жаль, це не працює. Він все ще показує помилки у специфікаційних файлах
dave0688

3

Вирішення цієї проблеми пов'язане з тим, що @Pace написав у своїй відповіді. Однак це не пояснює все так, якщо ви не заперечуєте, я напишу це сам.

РІШЕННЯ:

Додавання цього рядка:

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

на початку hero.spec.tsпроблема виправлення файлів. Шлях веде доtypings папки (де зберігаються всі типізації).

Щоб встановити типізацію, вам потрібно створити typings.jsonфайл у корені проекту із наступним вмістом:

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

І запустіть typings install(де typingsпакет NPM).


3
це нестандартний спосіб зробити це. правила tslint за замовчуванням запобігатимуть довідкові шляхи. використовуйте файл tsconfig, щоб вказати на node_modules
FlavorScape

3

У моєму випадку рішенням було усунути typeRootsмоє tsconfig.json.

Як ви можете прочитати в документі TypeScript

Якщо вказано typeRoots, будуть включені лише пакети під typeRoots.


3

Я сьогодні до останнього часу і знайшов найкращий спосіб вирішити це - нічого не робити ... ні typeRootsні typesні, excludeне includeвсі параметри за замовчуванням спрацьовують нормально. Насправді це не спрацювало для мене, поки я не видалив їх усіх. Я мав:

"exclude": [
    "node_modules"
]

але це за замовчуванням, тому я це усунув.

Я мав:

"types": [
    "node"
]

щоб пройти якесь попередження компілятора. Але зараз я теж це зняв.

Попередження, якого не повинно бути: error TS2304: Cannot find name 'AsyncIterable'. відnode_modules\@types\graphql\subscription\subscribe.d.ts

що дуже неприємно, тому я зробив це в tsconfig, щоб він завантажував його:

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

оскільки він знаходиться в наборі esnext. Я не використовую його безпосередньо, тому тут не турбуйтеся про сумісність. Сподіваюся, що згодом мене не спалить.


Вам не потрібно , щоб додати "types": ["node"]в tsconfig.jsonале ви повинні додати цей тип в tsconfig.app.json! Ви не повинні мати це попередження знову, я думаю. Ви можете зберегти "target": "es5"або "target": "es6"зараз.
Крістоф Шевальє

2

Лише потрібно було зробити наступне, щоб забрати @types в Lerna Mono-repo, де існує декілька node_modules.

npm install -D @types/jasmine

Потім у кожному tsconfig.file кожного модуля чи програми

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

За замовчуванням у вашу компіляцію входять усі видимі пакети "@types". Пакети у типах node_modules / @ будь-якої папки, що додається, вважаються видимими; конкретно, це означає пакети в ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ тощо. Дивіться офіційну документацію
Крістоф Шевальє

1

Для того, щоб компілятор TypeScript під час компіляції використовував усі видимі Визначення типів, typesопцію слід повністю видалити з compilerOptionsполя у tsconfig.jsonфайлі.

Ця проблема виникає, коли typesв compilerOptionsполі є деякі записи , де одночасно jestзапис відсутні.

Тому для того , щоб виправити цю проблему, compilerOptionsполе в вашому tscongfig.jsonповинні або включати jestв typesобласті або позбутися від 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"
  ]
}

Це працює для мене, я мав google map typesв typesопції. Після повного видалення опції він працював чудово.
pritesh agrawal

1

Я просто додам відповідь на те, що працює для мене в "typecript": "3.2.4" Я зрозумів, що у жасмину в node_modules / @ type є папка для ts3.1 під типом жасмину, ось ось кроки: -

  • Встановіть тип жасмину npm install -D @types/jasmine
  • Додати в tsconfig.json жасмін / ts3.1

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

  • Додайте Жасмін до типів

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

Примітка: Більше цього не потрібноimport 'jasmine';.


1

У моєму випадку я отримував цю помилку, коли я обслуговую програму, а не під час тестування. Я не розумів, що у моєму файлі tsconfig.app.json у мене інший параметр конфігурації.

У мене раніше було таке:

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

Це було, включаючи всі мої .spec.tsфайли при обслуговуванні програми. Я змінив include property toвилучення` і додав регулярний вираз, щоб виключити всі тестові файли, як це:

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

Зараз це працює як очікувалося.


0

Подивіться на імпорт, можливо, у вас є залежність від циклу , це в моєму випадку помилка, використовуючи import {} from 'jasmine';виправить помилки в консолі та зробить код комбінованим, але не видаляє корінь диявола (у моєму випадку залежність циклу).


0

Я на Angular 6, Typescript 2.7, і я використовую Jest Framework для тестування одиниць. Я @types/jestвстановив і додав typeRootsвсерединуtsconfig.json

Але все-таки є помилка відображення нижче (тобто: на терміналі немає помилок)

не вдається знайти опис імені

І додавання імпорту:

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

технічно нічого не робить, тому я подумав, що десь є імпорт, що викликає цю проблему, то я виявив, що якщо видалити файл

tsconfig.spec.json

в src/ папці, вирішив проблему для мене. Оскільки @types імпортується раніше, ніж всередині rootTypes.

Я рекомендую вам зробити те ж саме і видалити цей файл, не потрібна конфігурація всередині. (ps: якщо ти в тому самому випадку, що і я)


0

якщо помилка є у файлі .specs app / app.component.spec.ts (7,3): помилка TS2304: Неможливо знайти ім’я 'beforeEach'.

додайте це у верхній частині вашого файлу та npm встановіть rxjs

import {range} з 'rxjs'; імпортувати {map, filter} з 'rxjs / operator';

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.