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?


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.


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/jasmine@2.5.41. 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 Typescript@2.0 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.


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 Typescript@2.1.5
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 .


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

8

Com Typescript@2.0 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.


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).


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.


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.


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
],

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

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.


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.


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).


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)


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';

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.