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中height()方法获取各种高度大全
Apr 02 Javascript
javascript学习笔记之10个原生技巧
May 21 Javascript
chrome下jq width()方法取值为0的解决方法
May 26 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
Nov 30 Javascript
AngularJS基础 ng-include 指令简单示例
Aug 01 Javascript
js+canvas实现动态吃豆人效果
Mar 22 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 Javascript
详解用webpack把我们的业务模块分开打包的方法
Jul 20 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
Aug 16 Javascript
详解Webpack多环境代码打包的方法
Aug 03 Javascript
简化版的vue-router实现思路详解
Oct 19 Javascript
springboot+vue实现文件上传下载
Nov 17 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 方便水印和缩略图的图形类
2009/05/21 PHP
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
使用Modello编写JavaScript类
2006/12/22 Javascript
js截取函数(indexOf,join等)
2010/09/01 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
jQuery的内容过滤选择器学习教程
2016/04/18 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
Python地图绘制实操详解
2019/03/04 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
幼儿园校车司机的岗位职责
2014/01/30 职场文书
机关党员公开承诺书
2014/08/30 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
单位作风建设自查报告
2014/10/23 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
vue实现锚点定位功能
2021/06/29 Vue.js
Django框架中表单的用法
2022/06/10 Python