Angular 2 единицы тестов: не удается найти имя "описать"

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

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

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

Невозможно найти имя "описать".

Невозможно найти имя 'it'.

Невозможно найти имя "ожидать".

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

Ответ 1

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

npm install --save-dev @types/jasmine

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

import 'jasmine';

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

Ответ 2

С [email protected] или новее вы можете устанавливать типы с помощью:

npm install -D @types/jasmine

Затем импортируйте типы автоматически, используя опцию types в tsconfig.json:

"types": ["jasmine"],

Это решение не требует import {} from 'jasmine'; в каждом файле спецификации.

Ответ 3

npm install @types/jasmine

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

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

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

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

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

Ответ 4

Вам нужно установить набор текста для Жасмин. Предполагая, что вы пользуетесь относительно свежей версией машинописного текста 2, вы должны сделать следующее:

npm install --save-dev @types/jasmine

Ответ 5

С помощью Typescript @2.0 или более поздней версии вы можете установить типы с установкой npm

npm install --save-dev @types/jasmine

затем автоматически импортируйте типы, используя параметр typeRoots в tsconfig.json.

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

Это решение не требует импорта {} из 'jasmine'; в каждом файле спецификации.

Ответ 6

Решение этой проблемы связано с тем, что @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).

Ответ 7

Я в typeRoots на сегодняшний день и обнаружил, что лучший способ решить эту проблему - ничего не делать... нет 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",
}

так как это в заданном наборе. Я не использую его напрямую, поэтому пока не беспокоюсь о совместимости. Надеюсь, это не сожжет меня позже.

Ответ 8

В моем случае решение заключалось в удалении typeRoots в моем tsconfig.json.

Как вы можете прочитать в TypeScript doc

Если задано typeRoots, будут включены только пакеты под typeRoots.

Ответ 9

Нужно было только сделать следующее, чтобы забрать @types в Lerna Mono-repo, где существует несколько узлов node_modules.

npm install -D @types/jasmine

Затем в каждом файле tsconfig.file каждого модуля или приложения.

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

Ответ 10

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

Ответ 11

Я на 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.

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

Ответ 12

Чтобы компилятор 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"
  ]
}

Ответ 13

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

  • Установить тип jasmine npm install -D @types/jasmine
  • Добавить в tsconfig.json Жасмин /ts3.1

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

  • Добавить жасмин к типам

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

Примечание: нет необходимости для этого import 'jasmine'; больше.

Ответ 14

В моем случае я получал эту ошибку при обслуживании приложения, а не при тестировании. Я не осознавал, что в моем файле tsconfig.app.json был другой параметр конфигурации.

У меня ранее было это:

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

Он включал все мои файлы .spec.ts при обслуживании приложения. Я изменил include property to exclude 'и добавил регулярное выражение, чтобы исключить все тестовые файлы, например:

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

Теперь все работает как положено.