각도 2 단위 테스트 : 'describe'이름을 찾을 수 없습니다


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);
  });
});

단위 테스트는 매력처럼 작동합니다. 문제는 : 튜토리얼에 언급 된 오류가 있습니다.

우리의 편집기와 컴파일러는 무엇을 모르는 불평 수 itexpect그들이 재스민을 설명하는 입력 파일이 부족하기 때문이다. 우리는 그 성가신 불만이 무해하기 때문에 지금은 무시할 수 있습니다.

그리고 그들은 실제로 그것을 무시했습니다. 이러한 오류는 무해하지만 출력 오류가 발생하면 출력 콘솔에서 좋지 않습니다.

내가 얻는 것의 예 :

'설명'이름을 찾을 수 없습니다.

'it'이름을 찾을 수 없습니다.

'expect'이름을 찾을 수 없습니다.

이 문제를 해결하려면 어떻게해야합니까?


github에서 upvote하여이 버그를 고칠 수 있습니다 : github.com/TypeStrong/atom-typescript/issues/1125
Lucas Cimon

답변:


386

당신이 설치되기를 바랍니다-

npm install --save-dev @types/jasmine

그런 다음 hero.spec.ts파일 맨 위에 다음 가져 오기를 넣으십시오.

import 'jasmine';

문제를 해결해야합니다.


3
필요한 Typescript 버전에 따라 이전 버전을 설치해야 할 수도 있습니다. 예를 들어 typescript v2.0.9를 사용하는 현재 사용중인 이온 v2.2.1의 경우 설치해야했습니다 @types/jasmine@2.5.41. 그렇지 않으면 이러한 컴파일 오류가 나타날 수 있습니다 .
Tony O'Hagan

18
부작용으로 모듈을 가져올 수 있습니다.import 'jasmine';
camolin3

8
import {} from 'jasmine';실제로 무엇을 합니까? 와 같은 import 'jasmine'가요?
TetraDev

2
: 각도 6.0.3 : 난 그냥 "수입 {} 자스민에서"수입이 다시 일
에두아르도 Cordeiro이를

2
@aesede 어떤 PS 버전을 실행하십니까? 나는 따옴표없이 명령을 실행했으며 잘 진행되었습니다.
Konrad Viltersten

162

Typescript@2.0 이상에서는 다음을 사용하여 유형을 설치할 수 있습니다.

npm install -D @types/jasmine

그런 다음 types옵션을 사용하여 유형을 자동으로 가져옵니다 tsconfig.json.

"types": ["jasmine"],

이 솔루션은 import {} from 'jasmine';각 스펙 파일에 필요하지 않습니다 .


9
tsconfig.json (현재 v2.1)에 대한 TypeScript 문서마다 "types": ["jasmine"]더 이상 줄 을 추가 할 필요가 없습니다. "기본적으로 모든 보이는"@types "패키지는 컴파일에 포함됩니다. 모든 포함 폴더의 node_modules / @ types 패키지는 가시적 인 것으로 간주됩니다. 특히 ./node_modules/@types/, ../node_modules/@ types /, ../../node_modules/@types/ 등 "
bholben

12
내가 아는 @bholben하지만 어떤 이유 nodejasmine유형 감지되지 않습니다. 적어도 그것은 나를 위해 작동하지 않으며 Typescript@2.1.5를 사용하고 있습니다
Jiayi Hu

2
이 솔루션은 나를 위해 작동하지 않습니다 :( 죄송합니다. 사용했습니다 ang-app/e2e/tsconfig.json. 모든 json 레벨에서 시도했습니다 . 자세한 내용을 추가해 주시겠습니까?
Sergii

웹팩을 사용할 때는 작동하지 않습니다.이 경우 실제 라이브러리를 제공해야합니다. 'jasmine'에서 가져 오기 {}를 통해 라이브러리를 푸시합니다
Bogdan

(2.5에서) 이것은 나를 위해 일하지만, 나 또한 3.5.3 내 글로벌 타이프 라이터를 업그레이드했다
jsaddwater

27
npm install @types/jasmine

일부 의견에서 언급했듯이 "types": ["jasmine"]더 이상 필요하지 않으며 모든 @types패키지가 컴파일에 자동으로 포함됩니다 (v2.1부터 생각합니다).

내 생각에 가장 쉬운 해결책은 tsconfig.json 에서 테스트 파일을 제외하는 것입니다.

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

이것은 나를 위해 작동합니다.

공식 tsconfig docs 에 대한 추가 정보 .


3
참고 사항 : 새로운 Angular 프로젝트에는 src/tsconfig.app.json, src/tsconfig.spec.jsontsconfig.json. 언급 된 "제외"섹션은 첫 번째 섹션의 일부입니다. "types": [ "jasmine" ]두 번째 부분.
마틴 슈나이더

2
VS Code에서는 프로젝트의 일부로 간주되지 않으므로 사양 파일에서 참조를 찾을 수 없습니다.
mleu

@ mleu 나는 같은 문제에 직면하고있다. 이 문제를 어떻게 해결 했습니까? 테스트 케이스를 작성할 때마다 스펙 파일 패턴을 exclude블록 에서 제거해야합니다 .
Shishir Anshuman

@ ShishirAnshuman : 나는 해결책을 찾지 못했고 프로젝트가 끝날 때 까지이 한계에 부응해야했습니다.
mleu

@mleu 오. 문제 없습니다. 해결 방법으로 내 프로젝트에서 tsconfig exclude블록 에서 spec 파일 패턴을 제거했습니다 . 그런 다음 tsconfig.build.json스펙 파일 패턴을 exclude블록에 추가하여 새 파일을 작성했습니다 . 이제 내 ts-loader옵션 (webpack.config)에서을 사용하고 tsconfig.build.json있습니다. 이러한 구성을 사용하면 모듈이 테스트 파일에서 분석되고 빌드를 작성하거나 서버를 시작하는 동안 테스트 파일이 제외됩니다.
Shishir Anshuman

13

jasmine에 타이핑을 설치해야합니다. 비교적 최신 버전의 typescript 2에 있다고 가정하면 다음을 수행 할 수 있습니다.

npm install --save-dev @types/jasmine

8

Typescript@2.0 이상을 사용하면 npm install로 유형을 설치할 수 있습니다

npm install --save-dev @types/jasmine

그런 다음 tsconfig.json 의 typeRoots 옵션을 사용하여 유형을 자동으로 가져 오십시오 .

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

이 솔루션에는 'jasmine'에서 가져 오기 {}가 필요하지 않습니다. 각 사양 파일에서.


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"
  }
}

그리고 NPM 패키지가 typings install있는 곳을 실행하십시오 typings.


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

여러 node_modules가 있는 Lerna Mono-repo 에서 @types를 가져 오기 위해 다음을 수행해야했습니다 .

npm install -D @types/jasmine

그런 다음 각 모듈 또는 앱의 각 tsconfig.file에서

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

기본적으로 보이는 모든“@types”패키지가 편집에 포함됩니다. 엔 클로징 폴더의 node_modules / @ types 패키지는 표시되는 것으로 간주됩니다. 특히 ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ 등의 패키지를 의미합니다. 참조 공식 문서
크리스토프 슈발리에

1

TypeScript Compiler가 컴파일 중에 보이는 모든 유형 정의를 사용하려면 파일의 필드에서 types옵션을 완전히 제거해야 합니다.compilerOptionstsconfig.json

일부 존재하는 경우이 문제가 발생 types항목 compilerOptions을 동시에 필드, jest항목이 행방 불명입니다.

따라서 문제를 해결하려면 compilerOptions영역의 필드 를 영역에 tscongfig.json포함 하거나 완전히 제거 해야합니다 .jesttypestypes

{
  "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옵션을 선택합니다. 옵션을 완전히 제거한 후에는 정상적으로 작동했습니다.
pritesh agrawal

1

"typescript": "3.2.4"에서 작동하는 항목에 대한 답변을 추가하겠습니다. node_modules / @ types의 jasmine에는 jasmine 유형 아래에 ts3.1 폴더가 있으므로 다음 단계를 수행했습니다.

  • 재스민 타입 설치 npm install -D @types/jasmine
  • tsconfig.json에 추가 jasmine / ts3.1

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

  • 유형에 재스민 추가

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

참고 :import 'jasmine'; 더 이상필요하지 않습니다.


1

필자의 경우 테스트 할 때가 아니라 앱을 제공 할 때이 오류가 발생했습니다. tsconfig.app.json 파일에 다른 구성 설정이 있다는 것을 알지 못했습니다.

나는 이전에 이것을 가지고 있었다 :

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

.spec.ts앱을 제공 할 때 모든 파일 이 포함되었습니다 . include property to제외를 변경하고 다음과 같은 모든 테스트 파일을 제외하도록 정규 표현식을 추가했습니다.

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

이제 예상대로 작동합니다.


0

가져 오기를 살펴보면 사이클 종속성 이 있을 수 있습니다. 이 경우 내 import {} from 'jasmine';오류는 콘솔의 오류를 수정하고 코드를 컴파일 할 수있게하지만 악마의 뿌리를 제거하지는 않습니다 (내 경우에는 사이클 종속성).


0

Angular 6, Typescript 2.7을 사용하고 있으며 Jest 프레임 워크를 사용하여 단위 테스트를하고 있습니다. 나는 내부 @types/jest에 설치하고 추가했다typeRootstsconfig.json

그러나 여전히 아래에 디스플레이 오류가 있습니다 (즉 : 터미널에는 오류가 없습니다)

설명을 찾을 수 없습니다

그리고 수입을 추가 :

import {} from 'jest'; // in my case or jasmine if you're using jasmine

기술적으로 아무것도하지 않으므로이 문제를 일으키는 어딘가에 가져 오기가 있다고 생각했습니다. 그러면 파일을 삭제하면

tsconfig.spec.json

에서 src/폴더, 나를 위해 문제를 해결했다. @types는 rootTypes 내부로 가져 오기 전에.

내부에 필요한 구성이 없어도이 파일을 삭제하고 삭제하는 것이 좋습니다. (ps : 당신이 나와 같은 경우에)


0

오류가 .specs 파일에있는 경우 app / app.component.spec.ts (7,3) : 오류 TS2304 : 'beforeEach'이름을 찾을 수 없습니다.

이것을 파일 상단에 추가하고 npm install rxjs를 설치하십시오.

'rxjs'에서 {범위} 가져 오기; 'rxjs / operators'에서 {맵, 필터} 가져 오기;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.