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 相关文章推荐
学习YUI.Ext第五日--做拖放Darg&amp;Drop
Mar 10 Javascript
jquery 必填项判断表单是否为空的方法
Sep 14 Javascript
Js sort排序使用方法
Oct 17 Javascript
JS方法调用括号的问题探讨
Jan 24 Javascript
javascript 寻找错误方法整理
Jun 15 Javascript
jQuery中JSONP的两种实现方式详解
Sep 26 Javascript
详解Angular的双向数据绑定(MV-VM)
Dec 26 Javascript
JS实现改变HTML上文字颜色和内容的方法
Dec 30 Javascript
Vue实例简单方法介绍
Jan 20 Javascript
Javascript中的async awai的用法
May 17 Javascript
JS返回顶部实例代码
Aug 09 Javascript
vue 中Virtual Dom被创建的方法
Apr 15 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实现的获取网页中的图片并保存到本地的代码
2010/01/05 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
基于Zookeeper的使用详解
2013/05/02 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
php验证码生成代码
2015/11/11 PHP
php构造方法中析构方法在继承中的表现
2016/04/12 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
js格式化时间的方法
2015/12/18 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
JavaScript实现弹出窗口效果
2020/12/09 Javascript
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
python开发中range()函数用法实例分析
2015/11/12 Python
python自动12306抢票软件实现代码
2018/02/24 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
拾金不昧的表扬信
2014/01/16 职场文书
现场施工员岗位职责
2014/03/10 职场文书