Модульные тесты Angular 2: не удается найти имя «описать»

87

Я следую этому руководству из 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'.

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

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

Теги:
angular
unit-testing
jasmine

8 ответов

197
Лучший ответ

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

npm install --save-dev @types/jasmine

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

import {} from 'jasmine';

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

  • 0
    Если в Windows Powershell вам нужно выполнить npm install --save-dev "@types/jasmine" (обратите внимание на двойные кавычки) или вы получите ошибку
  • 3
    В зависимости от требуемой версии Typescript может потребоваться установить более раннюю версию. Например, для ionic v2.2.1, который я сейчас использую и который использует typcript v2.0.9, мне нужно было установить @types/[email protected] . В противном случае вы можете увидеть эти ошибки компиляции .
Показать ещё 8 комментариев
90

С помощью Typescript @2.0 или более поздней версии вы можете установить типы с помощью npm install @types/jasmine, а затем импортировать типы автоматически, используя опцию types в tsconfig.json.

"types": ["jasmine"],

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

  • 7
    В соответствии с документами TypeScript для tsconfig.json (v2.1 в настоящее время), больше нет необходимости добавлять строку "types": ["jasmine"] . «По умолчанию все видимые пакеты« @types »включены в вашу компиляцию. Пакеты в node_modules / @ types любой вложенной папки считаются видимыми; в частности, это означает, что пакеты внутри ./node_modules/@types/, ../node_modules/@ types /, ../../node_modules/@types/ и т. д. "
  • 7
    @bholben Я знаю, но по какой-то причине типы node и jasmine не обнаружены. По крайней мере, это не работает для меня, и я использую [email protected]
Показать ещё 4 комментария
10

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

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

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

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

Дополнительная информация в официальном tsconfig docs.

  • 3
    просто примечание: новые проекты Angular имеют src/tsconfig.app.json , src/tsconfig.spec.json и tsconfig.json . Упомянутый раздел «исключить» является частью первого. "types": [ "jasmine" ] часть 2-го.
  • 1
    Обратите внимание, что в VS Code вы теряете возможность находить ссылки в ваших спецификациях, так как они не будут считаться частью Проекта.
Показать ещё 4 комментария
10

Вам нужно установить тиснения для жасмина. Предполагая, что вы находитесь в относительно новой версии typescript 2, вы должны иметь возможность:

npm install --save-dev @types/jasmine

2

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

npm install --save-dev @types/jasmine

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

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

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

  • 1
    К сожалению, это не работает. Он по-прежнему показывает ошибки в спецификации файлов
2

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

  • 2
    это нестандартный способ сделать это. правила tslint по умолчанию будут препятствовать ссылочным путям. используйте файл tsconfig, чтобы указать на node_modules
1

Я до последнего времени и нашел лучший способ решить это - ничего не делать... no typeRoots no types no exclude no 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. Я не использую его напрямую, поэтому пока не стоит беспокоиться о совместимости. Надеюсь, что меня больше не сгорит.

  • 0
    Вам не нужно добавлять "types": ["node"] в tsconfig.json но вы должны добавить этот тип в tsconfig.app.json ! Вы не должны иметь это предупреждение снова, я думаю. Теперь вы можете оставить "target": "es5" или "target": "es6" .
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню