原文链接[Angular Schematics: Unit Testing](https://blog.angular.io/angular-schematics-unit-testing-3a0a9aaab186)

构建 Schematics 是很神奇的。只需很少的代码,您就可以重复在多个项目中生成大型结构。与任何编码一样,您将希望创建单元测试,以确保您所做的每个更改都是准确的,并且可以轻松地测试许多情况。在开始使用 Schematics 时,如何为您创建的工具创建测试可能并不十分明显。

在这篇文章中,我们将会看到一种为 Angular Schematics 创建单元测试的方法,它是基于之前发布的另一篇关于创建简单 Schematics 的文章。

基础的单元测试代码

当您第一次开始使用一个新的单元测试文件时,不需要做太多的工作。只需要确定起始入口,那就是 index_spec.ts 文件,内容是 Schematics 生成输出的代码。

import { Tree } from '@angular-devkit/schematics';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import * as path from 'path';const collectionPath = path.join(__dirname, '../collection.json');describe('simple-schematic', () => {it('works', () => {const runner = new SchematicTestRunner('schematics', collectionPath);const tree = runner.runSchematic('simple-schematic', {}, Tree.empty());expect(tree.files).toEqual([]);});
});

现在,除了在筒仓中运行 Schematics 并断言输出是一个空文件树之外,它什么也不做。我们需要进一步准确地测试您的代码。

模拟应用程序环境

生成器提供的基本单元测试只是… 基础的。我们需要扩展单元测试,以更准确地反映代码将运行的实际环境。这意味着我们需要运行一些 Angular Schematics 来构建 Angular 项目工作区。

为此,我们将向单元测试中添加一些代码。首先,我们需要设置 Angular Schematics 的运行选项。

import {Schema as WorkspaceOptions} from '@schematics/angular/workspace/schema';
import {Schema as ApplicationOptions} from '@schematics/angular/application/schema';...const workspaceOptions: WorkspaceOptions = {name: 'workspace',newProjectRoot: 'projects',version: '6.0.0',
};const appOptions: ApplicationOptions = {name: 'bar',inlineStyle: false,inlineTemplate: false,routing: false,style: 'css',skipTests: false,skipPackageJson: false,
};

然后,我们需要在运行任何测试之前创建应用程序文件树。它使用实例化的 runExternalSchematic 来访问 Angular Schematic, 并通过它生成工作区和应用程序树。

let appTree: UnitTestTree;
beforeEach(() => {appTree = testRunner.runExternalSchematic('@schematics/angular', 'workspace', workspaceOptions);appTree = testRunner.runExternalSchematic('@schematics/angular', 'application', appOptions, appTree);
});

现在,在每次测试之前,我们通过运行这个代码来创建 Angular 项目工作区。

附注:使用随机代码块并不总是容易的。我建议查看最终的单元测试文件,看看它实际上是什么样子的。
福利!有两种方法可以设置 Angular 工作区,一种是单个项目,另一种是多个项目。在最后的单元测试文件中,我展示了如何设置和测试这两种格式。再来看看吧!

增加测试

在我们的测试环境设置中,我们只需要开始创建一些测试。我将创建三个不同的测试。

首先,如果你在没有Angular项目树设置的情况下运行这个 Schematic 会发生什么。在本例中,我只是测试是否抛出了错误。这是您的测试的良好开端,但是在下一个示例中,我们将看到如何进一步进行更详细的测试。

it('fails with missing tree', () => {expect(() => testRunner.runSchematic('simple-schematic', {name: "test"}, Tree.empty())).toThrow();
});

第二,如果在没有必要参数的情况下运行此 Schematic 会发生什么。在这个示例中,我进一步展示了如何测试特定的错误类型和消息。

it('fails with missing params', () => {expect(() => testRunner.runSchematic('simple-schematic', {}, appTree)).toThrowError(InvalidInputOptions,'Schematic input does not validate against the Schema: {"spec":true,"flat":false}n'+'Errors:nn'+'  Data path "" should have required property 'name'.');
});

最后,如果一切设置正确会发生什么。

it('works', () => {const tree = testRunner.runSchematic('simple-schematic', {name: "test"}, appTree);//[see assertions below]
});

有了这些测试,我们只需要专注于特定的值符合我们的测试中的断言。

对创建的文件进行断言

您可以编写的第一个断言是断言在应用程序树中创建特定的文件。我们可以通过断言比对使用数组格式文件列表准确的实现这一点。

expect(tree.files).toEqual(["/README.md","/angular.json","/package.json","/tsconfig.json","/tslint.json","/.editorconfig","/.gitignore",..."/projects/bar/src/app/test/test.spec.ts","/projects/bar/src/app/test/test.ts",...
]);

或者我们可以检查生成的文件是否在 tree.files 数组中。因此,您不必匹配确切的 内容(例如,它会在 Angular Schematics 的不同版本之间改变)。

expect(tree.files).toContain("/projects/bar/src/app/test/test.spec.ts");
expect(tree.files).toContain("/projects/bar/src/app/test/test.ts");

两种选择都可以,这取决于您的需要。但是,如果您特别需要查看输出的内容并确保它确实是您所需要的,该怎么办呢?这要对创建的内容的断言。

对创建的内容断言

如果您需要确保生成的内容满足特定的规范,那么您还可以逐个文件读取内容,并断言是你期望的内容或包含必要的文本。这很容易做到,如下面的代码段所示。

expect(tree.readContent("/projects/bar/src/app/test/test.ts")).toContain("export class Test {n" +"n" +"}");

很容易!现在,我已经确保文件的输出完全符合我的意图。

结论

您应该看到,为 Schematics 编写单元测试是相当容易的,并且可以确保内容以您想要的方式输出。对我来说,最困难的事情是如何建立包含 Angular 项目工作区的文件结构,在那之后就轻而易举了。

同样,如果您想查看最终文件,请查看以下链接。

https://github.com/jonbcampos/schematics/blob/master/simple-schematic/src/simple-schematic/index_spec.ts

idea2020.2中@test是怎么测试的_[翻译]Angular Schematics: 单元测试相关推荐

  1. idea2020.2中@test是怎么测试的_Sklearn 划分训练集和测试集

    [从零开始学机器学习第 03 篇] 摘要:手写 Sklearn 的 train_test_split 函数. 之前两篇文章以酒吧的红酒故事引出了 kNN 分类算法,根据已倒好的酒(样本),预测新倒的酒 ...

  2. pytest测试框架_聊聊 Python 的单元测试框架(三):最火的 pytest

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 一.介绍 本篇文章是<聊聊 Python 的单元测试框架>的第三篇,前两篇分别介绍了标准库 unittes ...

  3. c语言链表如何做成环,在C语言中单向链表环测试并返回环起始节点的实现方法...

    小编想问大家一个问题,就是如果我们需要进行测试一个单向链表是否存在环,应该使用什么方法才是最好的呢?如果大家还不知道有什么方法的话,那就接着往下面看哟!因为今天小编就要为大家介绍一下:在C语言中单向链 ...

  4. python中test_在python中生成py.test测试

    先问一下,然后一个解释,如果你有兴趣. 在py.test的上下文中,如何从一小组测试函数模板生成大量测试函数? 就像是: models = [model1,model2,model3] data_se ...

  5. 怎样编写测试类测试分支_编写干净的测试–天堂中的麻烦

    怎样编写测试类测试分支 如果我们的代码有明显的错误,我们很有动力对其进行改进. 但是,在某些时候,我们认为我们的代码"足够好"并继续前进. 通常,当我们认为改进现有代码的好处小于所 ...

  6. r a/b 测试_R中的A / B测试

    r a/b 测试 什么是A / B测试? (What is A/B Testing?) A/B testing is a method used to test whether the respons ...

  7. 基于python渗透测试_Python中基于属性的测试简介

    基于python渗透测试 by Shashi Kumar Raja 由Shashi Kumar Raja Python中基于属性的测试简介 (Intro to property-based testi ...

  8. python中函数type可以测试对象类型_python类型检测最终指南--Typing模块的使用

    正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...

  9. delphi中webbrowse控件中模拟点击文本超链接_功能测试——控件测试

    对于单个逻辑功能,测试工程师需要关注其是否正确实现了需求定义的功能性需求,并需明确该需求是否确实应该在需求中体现. 例如,登陆功能,需关注其能否正确实现合法数据能够登陆,而非法数据拒绝登陆.商品查询功 ...

最新文章

  1. lightgbm 决策树 可视化 graphviz
  2. ionic 实现仿苹果手机通讯录搜索功能
  3. Java 打印目录结构
  4. CSS选择器速记笔记
  5. Spring :@Inject注解
  6. c语言图像压缩算法实现_kakadu——JPEG2000图像压缩软件的安装和使用
  7. vsftp客户端_vsftp 如何登陆?
  8. 机器学习算法总结之聚类:K-means
  9. 跟着开源项目学因果推断——whynot(十四)
  10. 设计学院5月免费公开课-ps抠图/网站配色技巧/UI设计/字体设计
  11. 畅捷通(chanjet)T1各版本
  12. android.net.http.AndroidHttpClient Android6.0 API23以后失效
  13. RPG多人回合制游戏战斗框架设计《一:基本战斗流程》
  14. [Linux 文件权限] 持续更新Linux文件权限命令
  15. HDU---2084树塔
  16. 2022hdu多校1C题题解
  17. 铁蛋白-AHLL纳米颗粒|人表皮生长因子-铁蛋白重链亚基纳米粒子(EGF-5Cys-FTH1)|铁蛋白颗粒包载氯霉素Chloramphenicol-Ferritin
  18. 计算机专业期刊参考文献,优秀计算机期刊文章参考文献 优秀计算机专著类参考文献有哪些-免费论文范文...
  19. 【OKR】11-12双月 OKR复盘
  20. 数据库中内连接、外连接、全连接

热门文章

  1. 规范化之路(一) Checkstyle插件安装使用
  2. unity两个项目合并 同名_表格合并,你还在复制粘贴?教你一键合并,超简单!...
  3. C语言socket发送json,C++实现Socket传输json封装的Mat
  4. c语言运算符优先级结合,C语言运算符优先级和结合性
  5. mysql 搜索正则表达式_mysql必知必会--用正则表达式 进行搜索
  6. 5 可隐藏的侧栏_家居中5种隐藏式设计,实用、高级、省空间
  7. 线路板铜厚测试软件,厚铜线路板的铜厚是如何实现的
  8. python中的map函数返回一个地址_python中的map函数
  9. AIX 6.1 连接DS4700,多路径mpio,mpio_get_config -Av 需要打补丁。
  10. 一杯水怎么测试_天气渐热食欲差、体质虚怎么办?每天一杯能量水——驼奶