angular组件间传值测试的方法详解


Posted in Javascript onMay 07, 2020

前言

我们知道angular组件间通讯有多种方法,其中最常用的一种方法就是借助于 @Input 和 @Output 进行通讯。具体如何通讯请参考angular组件间通讯,本文不再赘述,我们来讲讲关于此方法如何进行单元测试。

创建假组件

我们单元测试父组件与子组件的的交互是否符合我们的要求,我们在父组件进行测试,就需要模拟一个假的子组件出来,这样排除其他因素对测试的影响。

比如现在我在分页组件里写了一个每页大小选择组件,现在要测试一下组件间交互。现在分页组件就是我们的父组件,每页大小组件就是我们的子组件。我们现在需要去模拟一个假的子组件出来。我们先模拟一个假模块出来。

我们的子组件在core模块里,我们在core模块下创造一个core-testing模拟模块。再在core-testing模块下创造一个core组件,因为我们是一个模拟模块,我们只需要ts文件即可。

@Component({
 selector: 'app-size',
 template: `
 <p>
  size-select works!
 </p>
 `,
 styles: []
})
export class SizeComponent implements OnInit {
 constructor() {
 }

 ngOnInit() {
 }
}

为了我们可以在父组件的测试文件中得到模拟的子组件,我们还需要一个controller,在core-testing文件夹下创建一个core-testing-controller.ts文件。CoreTestingController类继承TestingController。

export class CoreTestingController extends TestingController {
}

同时在我们的core-testing.module里声明CoreTestingController为提供者

providers: [
 CoreTestingController
 ]

此时我们的目录树

 core-testing git:(134) ✗ tree  
.
├── core-testing-controller.ts
├── core-testing.module.ts
├── page
│   └── page.component.ts
└── size
    └── size.component.ts

因为我们是模拟的子组件,所以我们应该添加子组件的@Input 和 @Output,同时在构造函数里把这个模拟的子组件添加到CoreTestingController里。

export class SizeComponent implements OnInit {
 @Input() size: number;

 @Output() onChangeSize = new EventEmitter<number>();

 constructor(private controller: CoreTestingController) {
 this.controller.addUnit(this);
 }
}

此时我们的准备工作就完成了。

单元测试

首先我们引入假组件并声明提供者

import {CoreTestingController} from '../core-testing/core-testing-controller';
import {SizeComponent} from '../core-testing/size/size.component';

beforeEach(async(() => {
 TestBed.configureTestingModule({
  declarations: [ PageComponent, SizeComponent ],
  imports: [FormsModule],
  providers: [
  CoreTestingController
  ]
 })
 .compileComponents();
 }));

我你们这里引入的是我们创造的假的SizeComponent,因为我们父组件与子组件在同一个模块里,所以我们直接引入SizeComponent就可以。

此时我们父组件想要子组件时就会使用假的子组件。

我们先断言@Input,我们断言父组件的值与我们假的子组件值相等

it('选择每页大小', () => {
 const controller = TestBed.get(CoreTestingController) as CoreTestingController;
 const sizeComponent = controller.get(SizeComponent) as SizeComponent;
 expect(sizeComponent.size).toBe(component.size);
 });

我们这里的get方法就对应的我们之前的构造函数的addUnit方法,具体参考TestingController类定义的方法。

然后我们再断言子组件向父组件@Output也没有问题,我们先spyon父组件接收子组件值的方法,然后定义一个变量并传给父组件,然后断言父组件接收到的值与子组件传的值相同。

spyOn(component, 'onSizeSelected');
const emitSize = 4;
sizeComponent.onChangeSize.emit(emitSize);
expect(component.onSizeSelected).toHaveBeenCalledWith(4);

这时我们就达到了我们测试的目的。

我们启动测试,发现我们本来的选择下拉框变成了文字,这就是我们假的子组件的效果。

angular组件间传值测试的方法详解

总结

我们进行单元测试,就需要除被测组件外,其他引用组件尽量为假,才能达到我们的目的。

到此这篇关于angular组件间传值测试的文章就介绍到这了,更多相关angular组件间传值测试内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
css结合js制作下拉菜单示例代码
Feb 27 Javascript
Js实现动态添加删除Table行示例
Apr 14 Javascript
jquery库文件略庞大用纯js替换jquery的方法
Aug 12 Javascript
JavaScript中指定函数名称的相关方法
Jun 04 Javascript
原生js实现无缝轮播图效果
Jan 11 Javascript
5种JavaScript脚本加载的方式
Jan 16 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
layui框架与SSM前后台交互的方法
Sep 12 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
Sep 11 Javascript
JavaScript TAB栏切换效果的示例
Nov 05 Javascript
vue+Element-ui实现登录注册表单
Nov 17 Javascript
关于Vue中的options选项
Mar 22 Vue.js
Node.js API详解之 timer模块用法实例分析
May 07 #Javascript
JS面试题中深拷贝的实现讲解
May 07 #Javascript
javascript 代码是如何被压缩的示例代码
May 06 #Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
May 06 #Javascript
Vue SSR 即时编译技术的实现
May 06 #Javascript
深入webpack打包原理及loader和plugin的实现
May 06 #Javascript
将Vue组件库更换为按需加载的方法步骤
May 06 #Javascript
You might like
PHP 7.0.2 正式版发布
2016/01/08 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
简介JavaScript中的italics()方法的使用
2015/06/08 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
浅谈在koa2中实现页面渲染的全局数据
2017/10/09 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
JS实现星星海特效
2019/12/24 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
2020/08/20 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
Python实现抓取百度搜索结果页的网站标题信息
2015/01/22 Python
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
初步剖析C语言编程中的结构体
2016/01/16 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
教师的实习鉴定
2013/12/15 职场文书
党风廉政教育心得体会2016
2016/01/22 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis