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的可多选的下拉列表框
Jul 20 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
Jun 19 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
Jul 13 Javascript
jquery点击改变class并toggle的实现代码
May 15 Javascript
js传值后台中文出现乱码的解决方法
Jun 30 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
Sep 24 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
Oct 28 Javascript
JavaScript基本类型值-Number类型
Feb 24 Javascript
在Vue中如何使用Cookie操作实例
Jul 27 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
Sep 15 Javascript
优雅的在React项目中使用Redux的方法
Nov 10 Javascript
微信小程序生成海报分享朋友圈的实现方法
May 06 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
Get或Post提交值的非法数据处理
2006/10/09 PHP
最简单的PHP程序--记数器
2006/10/09 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
基于jquery的滚动新闻列表
2010/06/19 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
用实例解释Python中的继承和多态的概念
2015/04/27 Python
python3中str(字符串)的使用教程
2017/03/23 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
python实现录音小程序
2020/10/26 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
超级实用的8个Python列表技巧
2020/08/24 Python
pycharm永久激活超详细教程
2020/10/29 Python
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
创建卫生先进单位实施方案
2014/03/10 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
求职意向书
2014/04/01 职场文书
国庆庆典邀请函
2015/02/02 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
MySQL中varchar和char类型的区别
2021/11/17 MySQL