Тестові кутові 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.