Ответ 1
Я надеюсь, что вы установили -
npm install --save-dev @types/jasmine
Затем поместите следующий импорт в hero.spec.ts
файла hero.spec.ts
-
import 'jasmine';
Это должно решить проблему.
Я следую этому руководству из 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
файла hero.spec.ts
-
import 'jasmine';
Это должно решить проблему.
С [email protected] или новее вы можете устанавливать типы с помощью:
npm install -D @types/jasmine
Затем импортируйте типы автоматически, используя опцию types
в tsconfig.json
:
"types": ["jasmine"],
Это решение не требует import {} from 'jasmine';
в каждом файле спецификации.
npm install @types/jasmine
Как уже упоминалось в некоторых комментариях, "types": ["jasmine"]
больше не нужны, все пакеты @types
автоматически включаются в компиляцию (начиная с версии 2.1, я думаю).
На мой взгляд, самое простое решение - исключить тестовые файлы в вашем файле tsconfig.json, например:
"exclude": [
"node_modules",
"**/*.spec.ts"
]
Это работает для меня.
Дополнительная информация в официальных документах tsconfig.
Вам нужно установить набор текста для Жасмин. Предполагая, что вы пользуетесь относительно свежей версией машинописного текста 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).
Я в 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",
}
так как это в заданном наборе. Я не использую его напрямую, поэтому пока не беспокоюсь о совместимости. Надеюсь, это не сожжет меня позже.
В моем случае решение заключалось в удалении typeRoots
в моем tsconfig.json
.
Как вы можете прочитать в TypeScript doc
Если задано typeRoots, будут включены только пакеты под typeRoots.
Нужно было только сделать следующее, чтобы забрать @types в Lerna Mono-repo, где существует несколько узлов node_modules.
npm install -D @types/jasmine
Затем в каждом файле tsconfig.file каждого модуля или приложения.
"typeRoots": [
"node_modules/@types",
"../../node_modules/@types" <-- I added this line
],
Посмотрите на импорт, возможно, у вас есть циклическая зависимость, в моем случае это была ошибка, используя import {} from 'jasmine';
исправит ошибки в консоли и сделает код компилируемым, но не удалит корень дьявола (в моем случае циклическая зависимость).
Я на 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.
Я рекомендую вам сделать то же самое и удалить этот файл, никакой необходимой конфигурации внутри. (пс: если вы в том же деле, что и я)
Чтобы компилятор 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"
]
}
Я просто добавлю Ответ для того, что работает для меня в "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';
больше.
В моем случае я получал эту ошибку при обслуживании приложения, а не при тестировании. Я не осознавал, что в моем файле tsconfig.app.json был другой параметр конфигурации.
У меня ранее было это:
{
...
"include": [
"src/**/*.ts"
]
}
Он включал все мои файлы .spec.ts
при обслуживании приложения. Я изменил include property to
exclude 'и добавил регулярное выражение, чтобы исключить все тестовые файлы, например:
{
...
"exclude": [
"**/*.spec.ts",
"**/__mocks__"
]
}
Теперь все работает как положено.