Я следую этому руководству из 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'.
Невозможно найти имя "ожидать".
Что я могу сделать, чтобы исправить это?
Я надеюсь, что вы установили -
npm install --save-dev @types/jasmine
Затем добавьте следующий импорт в начало файла hero.spec.ts
-
import {} from 'jasmine';
Он должен решить проблему.
npm install --save-dev "@types/jasmine"
(обратите внимание на двойные кавычки) или вы получите ошибку
@types/[email protected]
. В противном случае вы можете увидеть эти ошибки компиляции .
С помощью Typescript @2.0 или более поздней версии вы можете установить типы с помощью npm install @types/jasmine
, а затем импортировать типы автоматически, используя опцию types
в tsconfig.json
.
"types": ["jasmine"],
Это решение не требует import {} from 'jasmine';
в каждом spec файле.
"types": ["jasmine"]
. «По умолчанию все видимые пакеты« @types »включены в вашу компиляцию. Пакеты в node_modules / @ types любой вложенной папки считаются видимыми; в частности, это означает, что пакеты внутри ./node_modules/@types/, ../node_modules/@ types /, ../../node_modules/@types/ и т. д. "
node
и jasmine
не обнаружены. По крайней мере, это не работает для меня, и я использую [email protected]
Как уже упоминалось в некоторых комментариях, "types": ["jasmine"]
больше не нужен, все пакеты @types
автоматически включаются в компиляцию (поскольку, как я думаю, v2.1).
На мой взгляд, самым простым решением является исключение тестовых файлов в tsconfig.json, например:
"exclude": [
"node_modules",
"**/*.spec.ts"
]
Это работает для меня.
Дополнительная информация в официальном tsconfig docs.
src/tsconfig.app.json
, src/tsconfig.spec.json
и tsconfig.json
. Упомянутый раздел «исключить» является частью первого. "types": [ "jasmine" ]
часть 2-го.
Вам нужно установить тиснения для жасмина. Предполагая, что вы находитесь в относительно новой версии typescript 2, вы должны иметь возможность:
npm install --save-dev @types/jasmine
С помощью Typescript @2.0 или более поздней версии вы можете установить типы с установкой npm
npm install --save-dev @types/jasmine
затем автоматически импортируйте типы, используя параметр typeRoots в tsconfig.json.
"typeRoots": [
"node_modules/@types"
],
Это решение не требует импорта {} из 'jasmine'; в каждом файле спецификации.
Решение этой проблемы связано с тем, что @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).
Я до последнего времени и нашел лучший способ решить это - ничего не делать... 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. Я не использую его напрямую, поэтому пока не стоит беспокоиться о совместимости. Надеюсь, что меня больше не сгорит.
"types": ["node"]
в tsconfig.json
но вы должны добавить этот тип в tsconfig.app.json
! Вы не должны иметь это предупреждение снова, я думаю. Теперь вы можете оставить "target": "es5"
или "target": "es6"
.
В моем случае решение заключалось в удалении typeRoots
в моем tsconfig.json
.
Как вы можете прочитать в TypeScript doc
Если задано typeRoots, будут включены только пакеты под typeRoots.