Angular学习笔记69:Angular项目的单元测试 -- 对服务进行测试

2023-11-13

对服务进行测试

服务通常是单元测试中最简单的文件类型

对于简单,没有其他依赖的服务

对于一个没有其他依赖的服务,Mock 一些数据,进行测试即可

例如:对于一个公共数据处理的服务

import {Injectable} from '@angular/core';
import {Subject} from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class PublicDataService {

  private themeColor = null;
  private tenementList: Array<any>;     // 租户List
  public themeSubject = new Subject<any>();

  constructor() {
  }

  // tenementList Set方法  -- 用于从projectindex -> myproject 中
  public setTenementList(list): void {
    this.tenementList = list;
    const tenementhandledList = [];
    this.tenementList.forEach(tenement => {
      const projectList = [];
      tenement.comSystems.forEach(project => {
        const projectObject = {
          value: project.id,
          label: String(project.tagName).toUpperCase() + '-' + project.projectName,
          isLeaf: true
        };
        projectList.push(projectObject);
      });
      const tenementObject = {
        value: tenement.id,
        label: tenement.tenantName,
        children: projectList,
      };
      tenementhandledList.push(tenementObject);
    });
    this.tenementList = tenementhandledList;
  }

  // tenementList Get方法  -- 用于从projectindex -> myproject 中
  public getTenementList(): Array<any> {
    return this.tenementList;
  }
  // 设置主题
  public setTheme(theme: string): void {
    switch (theme) {
      case '0':
        this.themeColor = 'green-theme';
        break;
      case '1':
        this.themeColor = 'blue-theme';
        break;
      case '2':
        this.themeColor = 'red-theme';
        break;
    }
    window.localStorage.setItem('platformTheme', this.themeColor);
    this.themeSubject.next(this.themeColor);
  }

  public getTheme(): string {
    return this.themeColor;
  }

}

在测试文件中,既可以使用TestBed创建一个 服务的实例进行测试,也可以直接 new 一个实例出来进行测试。

import {TestBed} from '@angular/core/testing';

import {PublicDataService} from './public-data.service';

describe('PublicDataService', () => {
  let publicDataService: PublicDataService;
  beforeEach(() => {
    publicDataService = new PublicDataService();
    TestBed.configureTestingModule({});
  });
  
  it('should be created', () => {
    const service: PublicDataService = TestBed.get(PublicDataService);
    expect(service).toBeTruthy();
  });

  it('should test function setTheme is green-theme', () => {
    publicDataService.setTheme('0');
    expect(window.localStorage.getItem('platformTheme')).toBe('green-theme');
    expect(publicDataService.getTheme()).toBe('green-theme');
    publicDataService.themeSubject.subscribe(theme => {
      expect(theme).toBe('green-theme');
    });
  });

  it('should test function setTheme is blue-theme', () => {
    publicDataService.setTheme('1');
    expect(window.localStorage.getItem('platformTheme')).toBe('blue-theme');
    expect(publicDataService.getTheme()).toBe('blue-theme');
    publicDataService.themeSubject.subscribe(theme => {
      expect(theme).toBe('blue-theme');
    });
  });

  it('should test function setTheme is red-theme', () => {
    publicDataService.setTheme('2');
    expect(window.localStorage.getItem('platformTheme')).toBe('red-theme');
    expect(publicDataService.getTheme()).toBe('red-theme');
    publicDataService.themeSubject.subscribe(theme => {
      expect(theme).toBe('red-theme');
    });
  });
});

  • TestBed 方式的测试
it('should be created', () => {
    const service: PublicDataService = TestBed.get(PublicDataService);
    expect(service).toBeTruthy();
  });

在这里通过 TestBed 的 get() 方法去创建了一个PublicDataService类型的service,然后在断言service的可否正确创建。

  • 非 TestBed 方式的测试
it('should test function setTheme is green-theme', () => {
    publicDataService.setTheme('0');
    expect(window.localStorage.getItem('platformTheme')).toBe('green-theme');
    expect(publicDataService.getTheme()).toBe('green-theme');
    publicDataService.themeSubject.subscribe(theme => {
      expect(theme).toBe('green-theme');
    });
  });

这里的 publicDataService 是在 beforeEach 的函数中创建出来的

beforeEach(() => {
    publicDataService = new PublicDataService();
    TestBed.configureTestingModule({});
  });

然后使用 publicDataService 去调用服务里的方法,然后进行测试用例的断言。

对于有其他依赖的服务

在有些服务中,会涉及到其他注入到构造函数中的服务,在进行单元测试的时候,需要手工创建并注入这些依赖。

例如:

  export class PublicDataService {
  
  private themeColor = null;
  
  constructor(private utilService: UtilService) {
    }
    
    public getLogoName() {
    return this.utilService.getLogoNameWithUtil();
    }
  }

在测试的时候,如何创建呢?

  • 通过真实的服务拿到真实的数据
it('should test function setPipeLineId', () => {
    const publicDataServiceNoBed: PublicDataService = new PublicDataService(new UtilService());
    publicDataServiceNoBed.setPipeLineId(1);
    expect(publicDataServiceNoBed.getPipeLineId()).toBe(1);
  });
  • 通过伪造的数据和伪造的服务对象来测试
it('# getLogoNameWithUtil should return faked value from a fake object', () => {
    const fake = {getLogoNameWithUtil: () => 'fake value'};
    const publicDataServiceAsFake = new PublicDataService(fake as UtilService);
    expect(publicDataServiceAsFake.getLogoName()).toBe('fake value');
  });

需要注意的是:fake中伪造的对象是依赖服务中的方法。getLogoNameWithUtil是UtilService中的方法

  • 通过spy创建一个对象,并使用一个简单的值去测试
it('#getLogoNameWithUtil should return stubbed value from a spy', () => {
    const valueServiceSpy = jasmine.createSpyObj('UtilService', ['getLogoNameWithUtil']);
    const stubValue = 'UtilService stub value';
    valueServiceSpy.getLogoNameWithUtil.and.returnValue(stubValue);
    const publicDataServiceAsSpy = new PublicDataService(valueServiceSpy);
    expect(publicDataServiceAsSpy.getLogoName())
      .toBe(stubValue, 'service returned stub value');
    expect(valueServiceSpy.getLogoNameWithUtil.calls.count())
      .toBe(1, 'spy method was called once');
    expect(valueServiceSpy.getLogoNameWithUtil.calls.mostRecent().returnValue)
      .toBe(stubValue);
  });
  

valueServiceSpy 是jasmine.createSpyObj是以UtilService为基础和getLogoNameWithUtil的方法名创建的对象。
calls.count() 返回spy调用的次数
calls.mostRecent() 以对象形式返回最近一次调用的上下文(this),以及传递的参数
需要注意的是,在使用jasmine.createSpyObj创建的时候,记得将UtilService 添加到providers数组中

TestBed.configureTestingModule({
      providers: [UtilService],
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular学习笔记69:Angular项目的单元测试 -- 对服务进行测试 的相关文章

  • 移动端 - 搜索组件(search-list篇)

    移动端 搜索组件 search input篇 移动端 搜索组件 suggest篇 这里我们需要去封装搜索历史组件 这一个组件还是很简单的 但是逻辑部分需要根据实际的需求来进行书写 所以这里我不太好去写实际的代码 不过可以提供我的思路 主要的
  • Spring的事务

    目录 一 Spring的事务 二 Spring事务如何实现 三 Spring事务的失效 一 Spring的事务 当我们在某个方法上添加了 Transactional注解后 就表示该方法在调用时会开启Spring事务 而这个方法所在的类所对应
  • 第九课,OpenGL光照之材质

    物体材质 在冯氏模型中 一个物体的材质由 全局光照系数 漫反射光照系数 反射光照系数 反射高光半径系数决定 分别由 ambient diffuse specular shininess表示 材质系数 The numbers Name Amb
  • 【博客管理】博客目录导航【置顶】

    一 OpenCV学习 OpenCV学习笔记 函数学习 OpenCV学习笔记 函数学习 一 MFC OpenCV2 4 7读取摄像头之cvCaptureFromCAM 的索引问题 OpenCV学习笔记 函数学习 二 MFC OpenCV2 4
  • 【华为OD机试2023】字符串解密 java python c++

    字符串解密 题目 题目描述 给定两个字符串string1和string2 string1是一个被加扰的宇符串 string1由小写英文字母 a z 和数字字符 0 9 组成 而加扰字符串由 0 9 a z 组成 string1里面可能包含0
  • 使用js控制浏览器开启全屏,判断浏览器是否处于全屏状态

    引入lodash import from lodash 切换全屏方法 export function fullScreen isOpen target let dom target void 0 let open list requestF
  • 什么是.Net?

    NET 是一个开发平台 或者叫开发者平台 使用 NET 你可以创建不同类型的应用程序 使用多种开发语言 编辑器和工具库创建网页 手机 桌面以及游戏等应用 其核心特点是 免费 开源和跨平台 1 语言和平台 我们先来理解一下什么是 NET 开发
  • URL 转为QR code(二维码)

    总结几种把网页url转为二维码的方法 1 Chrome浏览器 最快的一种方法就是用chrome自带的QR code分享 这种方法的缺点就是不能自定义二维码的格式 颜色 logo之类的 都是默认的小恐龙图标 2 chrome插件 可以在chr
  • 关于非同一局域网下两台设备之间的网络通信(服务器的作用)

    看过很多关于局域网下的两台设备之间的通信方式 最多的就是通过socket进行tcp ip通信 建立一个服务端 再建立一个客户端 客户端向服务端发起请求连接 然后再进行两端的通信 但发现其实这却存在着很多的问题与不足 如果是不在同一局域网下的
  • 新手搭建 react antd 环境笔记

    安裝依赖 npm install g create react app npm install antd mobile save npm install less loader less save dev npm install react
  • LeetCode【345】反转字符串中的元音字母

    题目 编写一个函数 以字符串作为输入 反转该字符串中的元音字母 示例 1 输入 hello 输出 holle 示例 2 输入 leetcode 输出 leotcede 说明 元音字母不包含字母 y public class LeetCode
  • linux system call

    1 SYSCALL DEFINE4 reboot 2 int magic1 3 int magic2 4 unsigned int cmd 5 void user ang 6 7 if capable CAP SYS BOOT 8 retu

随机推荐

  • python数据分析练习题

    本次作业尝试使用ipython和jupyter的notebook功能来实现py代码 首先是要配置环境 通过命令 pip install ipython pip install jypyter ipython notebook 配置并打开no
  • [机器学习]1.2虚拟环境&基础包安装初始化

    机器学习 第一章 Centos环境安装初始化 第二章 virtualenv及基础包环境安装初始化 机器学习 1 2虚拟环境 基础包安装初始化 机器学习 前言 一 python安装 二 pip3 virtualenv安装及环境变量配置 1 配
  • 08 FPGA—计数器与分频器的应用

    1 理论 时序逻辑电路中最基本的单元 寄存器 我们可以使用寄存器来做计数器 基本上关于时间的设计都离不开计数器 计数器在数字系统中主要是对脉冲的个数进行计数 以实现测量 计数和控制的功能 同时兼有分频功能 计数器一般都是从 0 开始计数 计
  • 第四章-图像加密与解密

    加密与加密原理 使用异或运算实现图像加密及解密功能 异或运算规则 相同为0 不同为1 运算数相同 结果为0 运算数不同 结果为1 任何数 0 1 与0异或 结果仍为自身 任何数 0 1 与1异或 结果为另外一个数 即0变1 1变0 任何数和
  • Ubuntu查看系统日志的几种方法

    在 Ubuntu 22 10 中 你可以查看系统日志来排查错误 以下是几种查看日志的方法 一 Journalctl 命令 使用 journalctl 命令可以查看系统日志信息 包括引起闪退的错误信息 你可以运行以下命令来查看最新的系统日志
  • GDAL根据Shape文件切图(java)

    目地 用Java实现类似QGIS中 按掩膜图层裁剪栅格 的功能 其实QGIS本身调用的就是gdalwarp exe 官方文档 https gdal org programs gdalwarp html gdalwarp gdalwarp h
  • js == 运算规则解析

    1 先了解一下基本类型和复杂类型划分的依据 JS中的值有两种类型 原始类型 Primitive 对象类型 Object 原始类型包括 Undefined Null Boolean Number和String等五种 这两大类别的数据存储方式是
  • 启明智显分享

    提示 作为Espressif 乐鑫科技 大中华区合作伙伴及sigmastar 厦门星宸 VAD合作伙伴 启明智显不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考 同时也用心整理了乐鑫及星宸科技的新产品 新方
  • 软文营销研究目标关键词让内容简单明了

    随着行业的发展 许多企业正在进入文案领域 对于喜欢写作的人来说 这是一条很好的道路 但对某些人来说也可能具有挑战性 一些初学者可能会觉得自己没有写作能力达不到标准 因此本文178软文网小编将帮你决定并学习如何成写出一篇成功有效的文案 一 向
  • yolov3整体工作流程(个人理解,欢迎纠正和补充)

    以下内容纯属个人理解 请路过的小伙伴留下宝贵意见 欢迎纠正和补充 谢谢 yolov3的总体思想归纳 首先 将输入图片压缩到416 416 通过特征提取网络 Darknet53 without FC layer 对输入图像提取特征得到大小一定
  • ubuntu下设置网络

    修改文件 etc network interfaces 命令 sudo vi etc network interfaces 或 sudo gedit etc network interfaces 我的配置如下 interfaces 5 fi
  • QT的信号槽的四种写法和五种链接方式

    目录 四种信号槽写法 五种连接方式 实例 常见错误及改正 错误1 未连接信号与槽 错误2 信号和槽参数不匹配 错误3 未使用Q OBJECT宏 错误4 跨线程连接未处理 在Qt中 信号 Signal 和槽 Slot 是一种用于对象之间通信的
  • 对于搞钱我们是认真的

    前言 大家好 我是xiezhr 一提到搞钱 想必大家都非常非常感兴趣 立马就精神抖擞了 说实话 在这疫情爆发这几年里 赚点钱真不容易 不知道你是不是也跟我一样 一个人在夜深人静的时候就在想怎么才能通过自己程序员的身份来搞钱呢 今天 我们就来
  • 基于JAVA的图书馆书库管理系统

    源码下载 https wwa lanzous com iMbYtmlznri 更多源码 http byamd xyz 论文
  • 数学建模课程

    数学规划模型 2020 3 7 1 数学规划 简称最优化问题 2 最优化问题的数学模式的一般形式 三个要素 决策变量 目标函数 约束条件 所确定的x的范围为 可行域 满足 2 的解 可行解 同时满足 1 2 最优解 整个可行域上 全局最优解
  • TensorFlow2.x,GPU代码测试

    TensorFlow2 x GPU代码测试 代码如下 import tensorflow as tf import os os environ TF CPP MIN LOG LEVEL 2 不显示等级2以下的提示信息 print GPU t
  • 测试开发工程师需要掌握什么技能?

    如何理解测试开发 有人问测试开发是测试还是开发 本质上来说 还是测试 因为测试是核心 开发是手段 那么说 成为测试开发 需要那些必备的技能呢 不同level的测试工程师应具备的基本技能第一个 我们称之为测试员 测试工程师 直白一点说 就是干
  • pandas学习笔记(三)---重建索引与处理缺失值

    本文介绍pandas中重建索引与处理缺失值 文章目录 一 重建索引 1 1series重建索引 1 2 dataframe重建索引并修改缺失值 二 处理缺失值 2 1丢掉含有缺失值的行或者列 2 2 填充缺失值 2 3判断df中每个元素是否
  • QT设置背景图片的3种方式 & 区别——设置样式表styleSheet

    方式1 修改MainWindow主窗口 的 styleSheet 1 效果图 工具栏和状态栏 也加了背景 参考链接https blog csdn net mozai147 article details 84112744 2 选中编辑Mai
  • Angular学习笔记69:Angular项目的单元测试 -- 对服务进行测试

    对服务进行测试 服务通常是单元测试中最简单的文件类型 对于简单 没有其他依赖的服务 对于一个没有其他依赖的服务 Mock 一些数据 进行测试即可 例如 对于一个公共数据处理的服务 import Injectable from angular