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 相关文章推荐
用于table内容排序
Jul 21 Javascript
网页右下角弹出窗体实现代码
Jun 05 Javascript
jQuery实现可展开合拢的手风琴面板菜单
Sep 15 Javascript
jQuery div拖拽用法实例
Jan 14 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
Feb 18 Javascript
node.js利用redis数据库缓存数据的方法
Mar 01 Javascript
vue 挂载路由到头部导航的方法
Nov 13 Javascript
在Vue methods中调用filters里的过滤器实例
Aug 30 Javascript
highCharts提示框中显示当前时间的方法
Jan 18 Javascript
亲自动手实现vue日历控件
Jun 26 Javascript
layer弹出层倒计时关闭的实现方法
Sep 27 Javascript
微信小程序实现单个或多个倒计时功能
Nov 01 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
强制PHP命令行脚本单进程运行的方法
2014/04/15 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
Laravel框架查询构造器简单示例
2019/05/08 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
js捆绑TypeScript声明文件的方法教程
2018/04/13 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
详解在Python程序中自定义异常的方法
2015/10/16 Python
20招让你的Python飞起来!
2016/09/27 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
python输入多行字符串的方法总结
2019/07/02 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
python实现同一局域网下传输图片
2020/03/20 Python
10张动图学会python循环与递归问题
2021/02/06 Python
2019年.net常见面试问题
2012/02/12 面试题
销售人员个人求职信
2013/09/26 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书
Fluentd搭建日志收集服务
2022/09/23 Servers