Модульные тесты Angular 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как, потому что им не хватает печатных файлов, которые описывают Jasmine. Мы можем пока игнорировать эти раздражающие жалобы, поскольку они безвредны.

И они действительно проигнорировали это. Несмотря на то, что эти ошибки безвредны, я не выгляжу хорошо в моей выходной консоли, когда получаю кучу таких ошибок.

Пример того, что я получаю:

Не могу найти название «описать».

Не могу найти имя 'оно'.

Не могу найти имя «ожидаю».

Что я могу сделать, чтобы это исправить?


Вы можете проголосовать на Github, чтобы исправить эту ошибку: github.com/TypeStrong/atom-typescript/issues/1125
Лукас Кимон,

Ответы:


387

Я надеюсь, что вы установили -

npm install --save-dev @types/jasmine

Затем поместите следующий импорт в верхней части hero.spec.tsфайла -

import 'jasmine';

Это должно решить проблему.


3
В зависимости от требуемой версии Typescript может потребоваться установить более раннюю версию. Например, для ionic v2.2.1, который я сейчас использую и использует typcript v2.0.9, мне нужно было установить @types/jasmine@2.5.41. В противном случае вы можете увидеть эти ошибки компиляции .
Тони О'Хаган

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

8
Что на import {} from 'jasmine';самом деле делает? Это так же, как import 'jasmine'?
TetraDev

2
В ANGULAR 6.0.3: я только что импортировал «import {} из жасмина», и он снова заработал
Эдуардо Кордейру,

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 / @ types любой вложенной папки считаются видимыми, в частности, это означает, что пакеты внутри ./node_modules/@types/, ../node_modules/@ типов /, ../../node_modules/@types/ и т. д. "
Бхолбен

12
@bholben Я знаю, но по какой-то причине nodeи jasmineтипы не обнаружены. По крайней мере, это не работает для меня, и я использую Typescript@2.1.5
Цзяи Ху

2
Это решение не работает для меня :(, извините. Я использовал его ang-app/e2e/tsconfig.json. Я пробовал его на каждом уровне json . Не могли бы вы добавить более подробную информацию?
Сергей

Это не будет работать при использовании веб-пакета - в этом случае нужно обслуживать реальную библиотеку - импорт {} из 'jasmine' проталкивает библиотеку через
Богдан

Это сработало для меня, но мне также пришлось обновить мой глобальный машинописный текст до 3.5.3 (с 2.5)
jsaddwater

27
npm install @types/jasmine

Как уже упоминалось в некоторых комментариях, "types": ["jasmine"]он больше не нужен, все @typesпакеты автоматически включаются в компиляцию (начиная с версии 2.1, я думаю).

На мой взгляд, самое простое решение - исключить тестовые файлы в вашем файле tsconfig.json, например:

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

Это работает для меня.

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


3
просто примечание: новые проекты Angular есть src/tsconfig.app.json, src/tsconfig.spec.jsonи tsconfig.json. Упомянутый раздел «исключить» является частью первого. "types": [ "jasmine" ]часть вторая.
Мартин Шнайдер

2
Обратите внимание, что в VS Code вы теряете возможность находить ссылки в ваших спецификационных файлах, так как они не будут считаться частью Проекта.
Млеу

@mleu Я столкнулся с той же проблемой. Как вы решили эту проблему? Каждый раз, когда я пишу тестовый пример, я должен удалить шаблон spec-файлов из excludeблока.
Шишир Аншуман

@ShishirAnshuman: я не нашел решения и должен был жить с этим ограничением, пока проект не закончился.
Млеу

@mleu Ох. Нет проблем. В моем проекте в качестве обходного пути я удалил шаблон spec-файла из excludeблока tsconfig . Затем я создал новый tsconfig.build.jsonфайл с шаблоном spec-файла, добавленным в 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область, либо полностью typesисключено:

{
  "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варианте. После полного удаления опции все заработало нормально.
Прите Агравал

1

Я просто добавлю Ответ для того, что работает для меня в "typcript": "3.2.4" Я понял, что у jasmine в node_modules / @ types есть папка для ts3.1 под типом jasmine, так что вот шаги: -

  • Тип установки жасмин 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 toexclude` и добавил регулярное выражение, чтобы исключить все тестовые файлы, например:

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

Я рекомендую вам сделать то же самое и удалить этот файл, никакой необходимой конфигурации внутри. (пс: если вы в том же деле, что и я)


0

если ошибка в файле .specs app / app.component.spec.ts (7,3): ошибка TS2304: невозможно найти имя beforeEach.

добавьте это в начало вашего файла и npm установите rxjs

import {range} из 'rxjs'; import {map, filter} из 'rxjs / operator';

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.