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 相关文章推荐
JQuery跨Iframe选择实现代码
Aug 19 Javascript
表单JS弹出填写提示效果代码
Apr 16 Javascript
用Javascript获取页面元素的具体位置
Dec 09 Javascript
javascripit实现密码强度检测代码分享
Dec 12 Javascript
JS图片自动轮换效果实现思路附截图
Apr 30 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
Aug 27 Javascript
jquery实现的缩略图预览滑块实例
Jun 25 Javascript
JS简单循环遍历json数组的方法
Apr 22 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
Jun 12 Javascript
jQuery购物网页经典制作案例
Aug 19 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
angularjs实现首页轮播图效果
Apr 14 Javascript
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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
PHP中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
php实现的顺序线性表示例
2019/05/04 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
js交换排序 冒泡排序算法(Javascript版)
2014/10/04 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
浅谈mvvm-simple双向绑定简单实现
2018/04/18 Javascript
Python实现简单的可逆加密程序实例
2015/03/05 Python
python判断字符串是否包含子字符串的方法
2015/03/24 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
python 实现识别图片上的数字
2019/07/30 Python
Python argparse模块应用实例解析
2019/11/15 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
图解CSS3制作圆环形进度条的实例教程
2016/05/26 HTML / CSS
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
实习生自我鉴定范文
2013/12/05 职场文书
广告设计应届生求职信
2014/03/01 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
项目合作协议书
2014/04/16 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
大学感恩节活动总结
2015/05/05 职场文书
高三物理教学反思
2016/02/20 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书