【问题标题】:Angular 2 Unit Tests: Cannot find name 'describe'Angular 2 单元测试:找不到名称“描述”
【发布时间】:2016-12-25 11:48:40
【问题描述】:

我关注this tutorial from 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 是因为它们缺少描述的打字文件 茉莉花。我们可以暂时忽略那些烦人的抱怨 无害。

他们确实忽略了它。尽管这些错误是无害的,但当我收到一堆错误时,它在我的输出控制台中看起来并不好。

我得到的示例:

找不到名称“描述”。

找不到名称“它”。

找不到名字'expect'。

我能做些什么来解决它?

【问题讨论】:

标签: unit-testing angular typescript jasmine


【解决方案1】:

我在 Angular 库中遇到了这个错误。原来我不小心将我的 .spec 文件包含在我的 public-api.ts 的导出中。删除导出解决了我的问题。

【讨论】:

    【解决方案2】:

    如果错误在 .specs 文件中 app/app.component.spec.ts(7,3):错误 TS2304:找不到名称“beforeEach”。

    将此添加到文件顶部并 npm install rxjs

    从'rxjs'导入{范围}; 从 'rxjs/operators' 导入 { map, filter };

    【讨论】:

    • 为什么安装和导入未使用的函数有助于解决打字问题?我怀疑这真的是一个有效的答案
    【解决方案3】:

    在我的情况下,我在提供应用程序时收到此错误,而不是在测试时。我没有意识到我的 tsconfig.app.json 文件中有不同的配置设置。

    我以前有这个:

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

    在提供应用程序时,它包括了我所有的 .spec.ts 文件。我更改了include property toexclude` 并添加了一个正则表达式来排除所有测试文件,如下所示:

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

    现在它可以按预期工作了。

    【讨论】:

      【解决方案4】:

      只需执行以下操作即可在 Lerna Mono-repo 中获取 @types 其中存在多个 node_modules。

      npm install -D @types/jasmine
      

      然后在每个模块或app的每个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/ 等中的包。见official documentation
      【解决方案5】:

      我到今天为止是最新的,发现解决这个问题的最佳方法是什么都不做...不typeRootstypesexcludeinclude所有默认值似乎都是工作得很好。实际上,在我将它们全部删除之前,它并不适合我。我有:

      "exclude": [
          "node_modules"
      ]
      

      但这是默认设置,所以我删除了它。

      我有:

      "types": [
          "node"
      ]
      

      克服一些编译器警告。但现在我也删除了它。

      不应该的警告是: error TS2304: Cannot find name 'AsyncIterable'. 来自node_modules\@types\graphql\subscription\subscribe.d.ts

      这非常令人讨厌,所以我在 tsconfig 中做了这个,以便它加载它:

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

      因为它在 esnext 集中。我没有直接使用它,所以暂时不用担心兼容性。希望以后不会烧到我。

      【讨论】:

      • 您不需要在tsconfig.json 中添加"types": ["node"],但您应该在tsconfig.app.json 中添加此类型!我认为你不应该再收到这个警告。您现在可以保留"target": "es5""target": "es6"
      【解决方案6】:

      我希望你已经安装了 -

      npm install --save-dev @types/jasmine
      

      然后将以下导入放在hero.spec.ts 文件的顶部 -

      import 'jasmine';
      

      应该能解决问题。

      【讨论】:

      • 根据所需的 Typescript 版本,您可能需要安装早期版本。例如,对于我目前使用的使用 typescript v2.0.9 的 ionic v2.2.1,我需要安装 @types/jasmine@2.5.41。否则你可能会看到these compilation errors
      • 你可以只导入模块来获得它的副作用:import 'jasmine';
      • import {} from 'jasmine'; 实际上是做什么的?和import 'jasmine'一样吗?
      • IN ANGULAR 6.0.3:我刚刚导入“import {} from jasmine”,它又可以工作了
      • @aesede 你运行什么版本的 PS?我刚刚执行了没有任何引号的命令,并且运行良好。
      【解决方案7】:

      您需要为 jasmine 安装类型。假设您使用的是相对较新的 typescript 2 版本,您应该能够做到:

      npm install --save-dev @types/jasmine
      

      【讨论】:

        【解决方案8】:

        我正在使用 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:如果你和我一样的话)

        【讨论】:

          【解决方案9】:

          我将在 "typescript": "3.2.4" 中添加对我有用的答案:-

          • 安装类型茉莉npm install -D @types/jasmine
          • 添加到 tsconfig.json jasmine/ts3.1

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

          • 将 Jasmine 添加到类型中

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

          注意:不再需要这个import 'jasmine';

          【讨论】:

            【解决方案10】:

            为了使 TypeScript 编译器在编译期间使用所有可见的类型定义,应从 tsconfig.json 文件中的 compilerOptions 字段中完全删除 types 选项。

            compilerOptions 字段中存在一些types 条目,同时缺少jest 条目时,就会出现此问题。

            因此,为了解决此问题,tscongfig.json 中的 compilerOptions 字段应在 types 区域中包含 jest 或完全删除 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"
              ]
            }
            

            【讨论】:

            • 这对我有用,我在types 选项中有google map types。完全删除该选项后,它工作正常。
            • 是的。我只需要删除类型的东西就可以了!
            【解决方案11】:

            使用 Typescript@2.0 或更高版本,您可以安装类型:

            npm install -D @types/jasmine
            

            然后使用tsconfig.json中的types选项自动导入类型:

            "types": ["jasmine"],
            

            此解决方案不需要在每个规范文件中都有import {} from 'jasmine';

            【讨论】:

            • 根据 tsconfig.json 的 TypeScript 文档(此时为 v2.1),不再需要添加 "types": ["jasmine"] 行。 “默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的 node_modules/@types 中的包都被认为是可见的;具体来说,这意味着 ./node_modules/@types/、../node_modules/@ 中的包types/、../../node_modules/@types/ 等等。”
            • @bholben 我知道,但由于某种原因,nodejasmine 类型未被检测到。至少它对我不起作用,我正在使用 Typescript@2.1.5
            • 这个解决方案对我不起作用 :(,抱歉。我在ang-app/e2e/tsconfig.json 中使用过它。我在每个 json 级别都尝试过。您能否添加更多详细信息?
            • 这在使用 webpack 时不起作用 - 在这种情况下需要提供实际的库 - import {} from 'jasmine' 会推动库通过
            • 这对我有用,但我还必须将我的全局打字稿升级到 3.5.3(从 2.5)
            【解决方案12】:

            看看导入可能你有一个循环依赖,在我的情况下这是错误,使用import {} from 'jasmine';将修复控制台中的错误并使代码可编译但不删除根恶魔(在我的例子中是循环依赖)。

            【讨论】:

              【解决方案13】:
              npm install @types/jasmine
              

              正如某些 cmets 中提到的,不再需要 "types": ["jasmine"],所有 @types 包都会自动包含在编译中(我认为是 v2.1 起)。

              在我看来,最简单的解决方案是排除 tsconfig.json 中的测试文件,例如:

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

              这对我有用。

              更多信息见官方tsconfig docs

              【讨论】:

              • 请注意:新的 Angular 项目有 src/tsconfig.app.jsonsrc/tsconfig.spec.jsontsconfig.json。提到的“排除”部分是第一个部分的一部分。 "types": [ "jasmine" ] 第 2 部分。
              • 请注意,在 VS Code 中,您无法在规范文件中查找引用,因为它们不会被视为项目的一部分。
              • @mleu 我面临同样的问题。你是如何解决这个问题的?每次编写测试用例时,我都必须从 exclude 块中删除规范文件模式。
              • @ShishirAnshuman:我没有找到解决方案,不得不忍受这个限制,直到项目结束。
              • @mleu 哦。没有任何问题。在我的项目中,作为一种解决方法,我从 tsconfig 的 exclude 块中删除了规范文件模式。然后我创建了一个新的tsconfig.build.json 文件,并将规范文件模式添加到exclude 块中。现在,在我的ts-loader 选项中(在 webpack.config 中)我使用的是tsconfig.build.json。使用这些配置,模块在测试文件中被解析,并且在创建构建或启动服务器时,测试文件被排除在外。
              【解决方案14】:

              就我而言,解决方案是删除我的tsconfig.json 中的typeRoots

              正如您在TypeScript doc 中看到的那样

              如果指定了 typeRoots,则只包含 typeRoots 下的包。

              【讨论】:

                【解决方案15】:

                使用 Typescript@2.0 或更高版本,您可以使用 npm install 安装类型

                npm install --save-dev @types/jasmine
                

                然后使用 tsconfig.json 中的 typeRoots 选项自动导入类型。

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

                此解决方案不需要 import {} from 'jasmine';在每个规范文件中。

                【讨论】:

                • 不幸的是,这不起作用。它仍然显示规范文件中的错误
                【解决方案16】:

                这个问题的解决方案与他的回答中的@Pace has written 有关。不过,它并不能解释一切,所以如果你不介意,我会自己写。

                解决方案:

                添加这一行:

                ///<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 包)。

                【讨论】:

                • 这是非标准的做法。默认 tslint 规则将阻止引用路径。使用 tsconfig 文件指向 node_modules
                猜你喜欢
                • 2017-03-25
                • 2023-04-04
                • 2017-12-30
                • 1970-01-01
                • 2014-03-28
                • 1970-01-01
                • 2020-02-15
                • 2011-10-30
                • 2023-03-22
                相关资源
                最近更新 更多