Testes de unidade angular 2: Não é possível encontrar o nome 'descrever'

213

Estou seguindo este tutorial do angular.io

Como eles disseram, eu criei o arquivo hero.spec.ts para criar testes de unidade:

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

Os testes de unidade funcionam como um encanto. O problema é: Eu vejo alguns erros, mencionados no tutorial:

Nosso editor e o compilador podem reclamar que não sabem o que são it e expectporque não possuem os arquivos de digitação que descrevem o Jasmine. Por enquanto, podemos ignorar essas reclamações irritantes, pois são inofensivas.

E eles realmente ignoraram. Mesmo que esses erros sejam inofensivos, ele não fica bem no meu console de saída quando eu recebo vários deles.

Exemplo do que recebo:

Não foi possível encontrar o nome 'descrever'.

Não foi possível encontrar o nome 'it'.

Não foi possível encontrar o nome 'expect'.

O que posso fazer para corrigi-lo?

Piotrek
fonte
Você pode votar no Github para corrigir este erro: github.com/TypeStrong/atom-typescript/issues/1125
Lucas Cimon

Respostas:

386

Espero que você tenha instalado -

npm install --save-dev @types/jasmine

Em seguida, coloque a seguinte importação na parte superior do hero.spec.tsarquivo -

import 'jasmine';

Deve resolver o problema.

ksharifbd
fonte
3
Dependendo da versão do Typescript necessária, pode ser necessário instalar uma versão anterior. Por exemplo, para o ionic v2.2.1 que estou usando atualmente e que usa o typescript v2.0.9, eu precisava instalar @types/[email protected]. Caso contrário, você poderá ver esses erros de compilação .
Tony O'Hagan
18
Você poderia simplesmente importar o módulo para os seus efeitos secundários:import 'jasmine';
camolin3
8
O que import {} from 'jasmine';realmente faz? É o mesmo que import 'jasmine'?
TetraDev 12/09
2
IN ANGULAR 6.0.3: Eu só importado "import {} de jasmim" e funcionou novamente
Eduardo Cordeiro
2
@aesede Qual versão do PS você roda? Acabei de executar o comando sem aspas e correu muito bem.
Konrad Viltersten 27/02/19
162

Com [email protected] ou posterior, você pode instalar tipos com:

npm install -D @types/jasmine

Importe os tipos automaticamente usando a typesopção em tsconfig.json:

"types": ["jasmine"],

Esta solução não requer import {} from 'jasmine';em cada arquivo de especificação.

Jiayi Hu
fonte
9
Por documentos do TypeScript para tsconfig.json (v2.1 no momento), não é mais necessário adicionar a "types": ["jasmine"]linha. "Por padrão, todos os pacotes" @types "visíveis estão incluídos na sua compilação. Os pacotes nos tipos node_modules / @ de qualquer pasta anexa são considerados visíveis; especificamente, isso significa pacotes dentro de ./node_modules/@types/, ../node_modules/@ tipos /, ../../node_modules/@types/ e assim por diante. "
bholben
12
@bholben eu sei, mas por algum motivo nodee jasminetipos não são detectados. Pelo menos não funciona para mim e estou usando [email protected]
Jiayi Hu
2
. Esta solução não funciona para mim :(, desculpe eu usei-o em ang-app/e2e/tsconfig.json. Eu tentei-o em todos os níveis json Poderia acrescentar mais detalhes.?
Sergii
Isso não funcionaria ao usar o webpack - nesse caso, a biblioteca real precisa ser atendida - a importação {} de 'jasmine' envia a biblioteca através de
Bogdan
Isso funcionou para mim, mas eu também tinha que atualizar meu typescript global para 3.5.3 (de 2,5)
jsaddwater
27
npm install @types/jasmine

Como mencionado em alguns comentários, "types": ["jasmine"]não é mais necessário, todos os @typespacotes são incluídos automaticamente na compilação (desde a v2.1, eu acho).

Na minha opinião, a solução mais fácil é excluir os arquivos de teste no seu tsconfig.json como:

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

Isso funciona para mim.

Mais informações nos documentos oficiais do tsconfig .

lenny
fonte
3
apenas uma observação: novos projetos Angular têm src/tsconfig.app.json, src/tsconfig.spec.jsone tsconfig.json. A seção "excluir" mencionada faz parte da 1ª. "types": [ "jasmine" ]parte do 2º.
Martin Schneider
2
Observe que no VS Code você perde a capacidade de encontrar referências em seus arquivos de especificação, pois eles não serão considerados parte do Projeto.
mleu
@leu Estou enfrentando o mesmo problema. Como você resolveu esse problema? Sempre que escrevi o caso de teste, tenho que remover o padrão dos arquivos de especificação do excludebloco.
Shishir Anshuman /
@ShishirAnshuman: Não encontrei uma solução e tive que conviver com essa limitação até o término do projeto.
mleu
@mleu Oh. Não há problema. No meu projeto como solução alternativa, removi o padrão de arquivo spec do excludebloco do tsconfig . Então eu criei um novo tsconfig.build.jsonarquivo com o padrão de arquivo de especificação adicionado ao excludebloco. Agora, nas minhas ts-loaderopções (no webpack.config) eu estou usando tsconfig.build.json. Com essas configurações, os módulos estão sendo resolvidos nos arquivos de teste e, ao criar a construção ou iniciar o servidor, os arquivos de teste são excluídos.
Shishir Anshuman
13

Você precisa instalar as tipagens para o jasmim. Supondo que você esteja em uma versão relativamente recente do texto datilografado 2, você poderá:

npm install --save-dev @types/jasmine
Ritmo
fonte
8

Com [email protected] ou posterior, você pode instalar tipos com o npm install

npm install --save-dev @types/jasmine

em seguida, importar os tipos automaticamente usando o typeRoots opção no tsconfig.json.

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

Esta solução não requer importação {} de 'jasmine'; em cada arquivo de especificação.

mvermand
fonte
1
Infelizmente isso não funciona. Ele ainda mostra os erros nos arquivos de especificação
dave0688 26/10
3

A solução para esse problema está relacionada ao que o @Pace escreveu em sua resposta. No entanto, não explica tudo, então, se você não se importa, eu escreverei sozinho.

SOLUÇÃO:

Adicionando esta linha:

///<reference path="./../../../typings/globals/jasmine/index.d.ts"/>

no início do hero.spec.tsarquivo corrige o problema. O caminho leva à typingspasta (onde todas as digitações são armazenadas).

Para instalar digitações, você precisa criar um typings.jsonarquivo na raiz do seu projeto com o seguinte conteúdo:

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

E execute typings install(onde typingsestá o pacote NPM).

Piotrek
fonte
3
essa é uma maneira não padrão de fazer isso. regras tslint padrão impedirão os caminhos de referência. usar o arquivo TSconfig para apontar para node_modules
FlavorScape
3

No meu caso, a solução foi remover o typeRootsno meu tsconfig.json.

Como você pode ler no documento TypeScript

Se typeRoots for especificado, apenas pacotes em typeRoots serão incluídos.

moppag
fonte
3

Estou atualizado até hoje e encontrei a melhor maneira de resolver isso é não fazer nada ... não typeRootsnão typesnão excludenão, includetodos os padrões parecem estar funcionando bem. Na verdade, não funcionou direito para mim até removê-los todos. Eu tinha:

"exclude": [
    "node_modules"
]

mas isso está nos padrões, então eu removi isso.

Eu tinha:

"types": [
    "node"
]

para passar por algum aviso do compilador. Mas agora eu também removi isso.

O aviso que não deveria ser é: error TS2304: Cannot find name 'AsyncIterable'. denode_modules\@types\graphql\subscription\subscribe.d.ts

o que é muito desagradável, então eu fiz isso no tsconfig para carregá-lo:

"compilerOptions": {
    "target": "esnext",
}

já que está no conjunto esnext. Eu não estou usando diretamente, então não se preocupe aqui com compatibilidade ainda. Espero que não me queime mais tarde.

philn5d
fonte
Você não precisa adicionar "types": ["node"], tsconfig.jsonmas deve adicionar esse tipo tsconfig.app.json! Você não deveria ter esse aviso novamente, eu acho. Você poderia ficar "target": "es5"ou "target": "es6"agora.
Christophe Chevalier
2

Só foi necessário fazer o seguinte para selecionar @types em um Lerna Mono-repo, onde existem vários node_modules.

npm install -D @types/jasmine

Em seguida, em cada tsconfig.file de cada módulo ou aplicativo

"typeRoots": [
  "node_modules/@types",
  "../../node_modules/@types" <-- I added this line
],
SoEzPz
fonte
Por padrão, todos os pacotes "@types" visíveis estão incluídos na sua compilação. Pacotes nos tipos node_modules / @ de qualquer pasta anexa são considerados visíveis; especificamente, isso significa pacotes dentro de ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ e assim por diante. Ver documentação oficial
Christophe Chevalier
1

Para que o TypeScript Compiler use todas as Definições de tipo visíveis durante a compilação, a typesopção deve ser removida completamente do compilerOptionscampo no tsconfig.jsonarquivo.

Esse problema surge quando existem algumas typesentradas no compilerOptionscampo, onde ao mesmo tempo jestestá faltando.

Portanto, para corrigir o problema, o compilerOptionscampo no tscongfig.jsondeve incluir jestna typesárea ou livrar-se typescompletamente:

{
  "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"
  ]
}
Omer Gurarslan
fonte
Isso funcionou para mim, eu tive google map typesa typesopção. Depois de remover a opção completamente, funcionou bem.
agrawal pritesh
1

Vou apenas adicionar a resposta para o que funciona para mim em "typescript": "3.2.4" Eu percebi que o jasmim em node_modules / @ types existe uma pasta para ts3.1 sob o tipo de jasmim, então aqui estão as etapas: -

  • Tipo de instalação jasmim npm install -D @types/jasmine
  • Adicione ao tsconfig.json jasmine / ts3.1

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

  • Adicione Jasmine aos tipos

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

Nota: Não háimport 'jasmine';maisnecessidade disso.

Eslam Mahgoub
fonte
1

No meu caso, eu estava recebendo esse erro ao servir o aplicativo, não ao testar. Não sabia que tinha uma configuração diferente no meu arquivo tsconfig.app.json.

Eu já tinha isso:

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

Estava incluindo todos os meus .spec.tsarquivos ao veicular o aplicativo. include property toAlterei o excluir` e adicionei um regex para excluir todos os arquivos de teste como este:

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

Agora funciona como esperado.

King James Enejo
fonte
0

Olhe para a importação, talvez você tenha uma dependência de ciclo , este foi o meu erro. Usar import {} from 'jasmine';corrigirá os erros no console e tornará o código compilável, mas não removerá a raiz do diabo (no meu caso, a dependência do ciclo).

G.Vitelli
fonte
0

Estou no Angular 6, TypeScript 2.7, e estou usando o framework Jest para teste de unidade. Eu tinha @types/jestinstalado e adicionado por typeRootsdentrotsconfig.json

Mas ainda tem o erro de exibição abaixo (ou seja: no terminal não há erros)

não consigo encontrar o nome descrever

E adicionando a importação:

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

tecnicamente não faz nada, então eu pensei, que há uma importação em algum lugar causando esse problema, então eu descobri que, se excluir o arquivo

tsconfig.spec.json

na src/pasta, resolveu o problema para mim. Como @types é importado antes dentro dos rootTypes.

Eu recomendo que você faça o mesmo e exclua este arquivo, nenhuma configuração necessária está dentro. (ps: se você estiver no mesmo caso que eu)

getName
fonte
0

se o erro estiver no arquivo .specs app / app.component.spec.ts (7,3): erro TS2304: Não foi possível encontrar o nome 'beforeEach'.

adicione isso ao topo do seu arquivo e o npm install rxjs

importar {range} de 'rxjs'; import {map, filter} de 'rxjs / operadores';

cfphpflex
fonte