unit testing - with - Angular 2 Testes Unitários: Não é possível encontrar o nome 'descrever'




testing angular components with karma (9)

Estou seguindo este tutorial do angular.io

Como eles disseram, eu criei o arquivo hero.spec.ts para criar testes unitários:

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

Testes de unidade funcionam como um encanto. O problema é: vejo alguns erros, que são mencionados no tutorial:

Nosso editor e o compilador podem reclamar que eles não sabem o que it e o it expect porque não possuem os arquivos de digitação que descrevem o Jasmine. Podemos ignorar as reclamações irritantes por enquanto, pois são inofensivas.

E eles realmente ignoraram isso. Mesmo que esses erros sejam inofensivos, não parece bom em meu console de saída quando recebo muitos deles.

Exemplo do que recebo:

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

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

Não é possível encontrar o nome 'esperar'.

O que posso fazer para corrigir isso?


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

SOLUÇÃO:

Adicionando esta linha:

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

no início do arquivo hero.spec.ts corrige o problema. O caminho leva à pasta de typings (onde todas as tipings são armazenadas).

Para instalar tipings você precisa criar o arquivo typings.json 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 o typings install (onde typings é o pacote NPM).


Com o [email protected] ou posterior, você pode instalar tipos com a instalação do npm

npm install --save-dev @types/jasmine

em seguida, importe os tipos automaticamente usando a opção typeRoots em tsconfig.json.

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

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


Eu espero que você tenha instalado -

npm install --save-dev @types/jasmine

Em seguida, coloque a seguinte importação no topo do arquivo hero.spec.ts -

import 'jasmine';

Deve resolver o problema.


Eu estou até o mais tardar a partir de hoje e encontrei a melhor maneira de resolver isso é não fazer nada ... no typeRoots sem types não exclude não include todos os padrões parecem estar funcionando muito bem. Na verdade, não funcionou direito para mim até que eu removi todos eles. Eu tinha:

"exclude": [
    "node_modules"
]

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

Eu tinha:

"types": [
    "node"
]

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

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

o que é muito desagradável, então eu fiz isso no tsconfig para que ele seja carregado:

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

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


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

Como você pode ler no documento do TypeScript

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


Olhe para a importação talvez você tenha uma dependência de ciclo , isso foi no meu caso o erro, usando a import {} from 'jasmine'; irá 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).


Só tinha que fazer o seguinte para pegar @types em uma Lerna Mono-repo onde existem vários node_modules.

npm install -D @types/jasmine

Então, em cada arquivo tsconfig de cada módulo ou aplicativo

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

Você precisa instalar typings para jasmine. Supondo que você esteja em uma versão relativamente recente do typescript 2, você deve ser capaz de fazer:

npm install --save-dev @types/jasmine

npm install @types/jasmine

Como mencionado em alguns comentários, os "types": ["jasmine"] não são mais necessários, todos os pacotes @types são automaticamente incluídos 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 .





jasmine