Spy的核心思路:避免service方法被实际调用!

Spyon两个参数:

  • class instance本身
  • 需要被spy的方法名,类型为字符串

如果使用.and.callThrough, 则方法会真正被调用。
如果使用.and.return, 则方法不会被真正调用。

待测试的Component里有一个Observable数组:

通过下面的代码赋值:

this.checkoutDeliveryService.getSupportedDeliveryModes();

checkoutDeliveryService的类型:CheckoutDeliveryService

在单元测试时,我们需要将CheckoutDeliveryService的实际实现隔离开,通过创建MockCheckoutDeliveryService实现。

首先在单元测试里创建一个mockcheckoutDeliveryService实例:

创建一个MockCheckoutDeliveryService类:

class MockCheckoutDeliveryService {loadSupportedDeliveryModes = createSpy();setDeliveryMode = createSpy();getSupportedDeliveryModes(): Observable<DeliveryMode[]> {return of();}getSelectedDeliveryMode(): Observable<DeliveryMode> {return of();}getLoadSupportedDeliveryModeProcess(): Observable<LoaderState<void>> {return of();}
}

其方法同真实的CheckoutDeliveryService类方法一致,差别在于返回的是空的Observable对象。

在TestBed.configureTestingModule的providers配置里,使用class MockCheckoutDeliveryService来注入CheckoutDeliveryService:

通过TestBed.inject得到mockCheckoutDeliveryService的实例:

使用spyOn代码将mockCheckoutDeliveryService类的方法getSupportedDeliveryModes的返回值设置成of(mockSupportedDeliveryModes):

这样,在单元测试执行时,Component调用checkoutDeliveryService的getSupportedDeliveryModes方法时,会自动返回我们在spyOn里指定的值。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

Angular单元测试的spyOn使用一例相关推荐

  1. [转]Angular 单元测试讲解

    Angular_单元测试 测试分类 按开发阶段划分 按是否运行划分 按是否查看源代码划分 其他 ATDD,TDD,BDD,DDD ATDD TDD BDD DDD Angular单元测试 Karma的 ...

  2. Angular 单元测试讲解

    Angular_单元测试 测试分类 按开发阶段划分 按是否运行划分 按是否查看源代码划分 其他 ATDD,TDD,BDD,DDD ATDD TDD BDD DDD Angular单元测试 Karma的 ...

  3. 如何在Angular单元测试里,对class protected方法进行测试

    例子: 我的service class里有一个protected方法,我想在单元测试里对其进行测试: 一种思路是,可以沿用Java里测试protected方法的变通方式,即创建一个新的sub clas ...

  4. Angular单元测试框架里API toHaveBeenCalledTimes的工作原理

    看这样一段代码: let spiedFirstFocusable = spyOn(keyboardFocusService,'findFirstFocusable').and.returnValue( ...

  5. Angular单元测试遇到的错误消息:Uncaught Error - Cannot find module tslib

    我的单元测试源代码: @Component({selector: 'cx-host',template: ` <div id="a" [cxFocus]="{ au ...

  6. Angular单元测试fixture.detectChanges()

    https://codecraft.tv/courses/angular/unit-testing/change-detection/ ATB:Angular Test Bed // create c ...

  7. Angular单元测试ComponentFixture的实例化过程明细

    从angular core里导入单元测试需要的库文件: import { async, ComponentFixture, TestBed } from '@angular/core/testing' ...

  8. Angular单元测试如何只执行指定的测试用例,提高测试速度

    Angular项目的规模一旦变大,待执行的单元测试的数目可能是海量的.此时在开发新的单元测试时,会遇到需要屏蔽到系统里已经非常稳定的测试,而只执行正在开发的新单元测试.这个需求如何实现呢? 每个Ang ...

  9. 使用setup函数替代beforeEach函数进行Angular单元测试

    具有依赖关系的Service源代码: import { Injectable } from '@angular/core';@Injectable() export class MasterServi ...

最新文章

  1. MinIO分布式专题(第一章、一文教你搭建MinIO单机版)
  2. malloc开辟的空间在哪一个区间_C++进阶系列之STL(2)SGI版本空间配置器
  3. 数据蒋堂 | 大数据计算语法的SQL化
  4. centos7下监控流量、数据包占用最大的进程
  5. VM虚拟机中的centos6.3命令行模式添加GCC
  6. 大数据技术下 分布式数据库何去何从?
  7. linux cpu 实际进程,linux – 找出高CPU占用率的apache进程实际上在做什么?
  8. 计算机 用户创建失败,电脑用户加载错误,无法创建新的配置文件的解决方法...
  9. 论文浅尝 | Data Intelligence - 多篇语义资源论文
  10. 开放域文本分类技术思考
  11. 对图像进行各种滤波的编程思路
  12. LTE下行物理层传输机制(6)-下行资源分配方式(Resource Allocation Type)
  13. linux 命令详解 大于号_shell重定向(大于号,小于号,左右,21,)
  14. 投资理财-基金基本术语概念整理
  15. 上亿只“小白鼠”有救了,AI可检测化学物质甚至还更准确
  16. 多向思考者--高敏感人群的内心世界
  17. 【2016】【论文笔记】差频可调谐THz技术——
  18. Unity API - A
  19. pinctrl 子系统介绍
  20. 解决CSR 8510 A10蓝牙适配器驱动安装不正常问题

热门文章

  1. 升级Python后yum不可用的解决方案
  2. PHP Module
  3. 百度地图API的第一次接触——标注和信息窗的使用
  4. Appium+python自动化8-Appium Python API
  5. C#如何生成缩略图、水印
  6. DNS DHCP 路由 FTP
  7. poj 1330 LCA (倍增+离线Tarjan)
  8. 前端面试题整理【转】
  9. kubernetes一步一步搭建与https访问
  10. SVM 核函数相关知识